将Git工作流转换为Mercurial

Bru*_*uno 3 git mercurial dvcs github bitbucket

我一直在使用Git,我想把我常用的工作流转换为Mercurial.特别是,我有兴趣转换我将用于贡献给Git项目的工作流程,以便能够为Mercurial项目做出贡献.

通常,对于GitHub上的项目,我会从原始项目中将项目分配到GibHub上,然后使用两个不同的远程名称在本地获取:

# Clone the initial repository and call the remote repository 'github-origin'
git clone -o github-origin git://github.com/orig_author/project.git

# Add the forked GitHub repo as an additional remote repo ('github-mine')
cd project
git remote add github-mine git://github.com/me/project.git
git fetch github-mine
Run Code Online (Sandbox Code Playgroud)

当我列出分支时git branch -a,我得到这样的东西:

* master
  remotes/github-mine/some_feature
  remotes/github-mine/master
  remotes/github-origin/HEAD -> github-origin/master
  remotes/github-origin/some_feature
  remotes/github-origin/master
Run Code Online (Sandbox Code Playgroud)

我可以创建自己的本地分支git checkout -b new_feature,然后将其推回到我的GitHub存储库,从而添加两个引用:

* my_feature
  remotes/github-mine/my_feature
Run Code Online (Sandbox Code Playgroud)

然后我可以联系原作者讨论这个功能,提交拉取请求等等.所有这些工作流程实际上都独立于原作者的工作时间线.这使得在不规范主项目存储库的情况下讨论实验性功能变得非常容易.

如果原作者提交了更多更改,我可以跟上git fetch github-orig并可能相应地合并或修改我的本地更改.作为快速测试(假设当前分支是my_feature):

git fetch github-origin
git checkout -b temp
git rebase github-origin/master
Run Code Online (Sandbox Code Playgroud)

此工作流程的一个重点是能够知道每个存储库的分支与我自己的分支相比的位置.特别是,知道我的分支与具有相同名称的远程分支不同是很重要的(例如,即使在两个GitHub存储库之间,两个master分支也不需要相同).看到这一切很容易使用gitk --all.

我不确定如何在Mercurial项目上做同样的事情(例如在BitBucket上).

以下是我尝试做的,基于此命令等效表:

hg clone https://bitbucket.org/orig_author/project

# Edit .hg/hgrc and add 'bb-mine=https://bitbucket.org/.../project' to [paths]

# Apparently equivalent to git fetch.
hg pull bb-mine
Run Code Online (Sandbox Code Playgroud)

这似乎工作,它拉远程提交(事实上,我已经在我已经推动我的一个分支的存储库上尝试过这个).我可以看到所有分支使用hg branches,但没有迹象表明它们来自何处.hg view没有真正显示任何东西.更重要的是,我tip现在是我提交的最新版本,但是我没有相应的github-origin/master标签(无论是在我自己的提交之前,还是在其他作者做出更多更改之后).

我希望能够在将来的任何时间做一个hg pull(相当于git fetch),以查看我的本地副本与其他作者所做的新更改之间的差异,而不必在我的本地更改任何内容存储库或我的BitBucket存储库(至少在我修复了由于这些更改引起的潜在冲突之前).

除此之外,backup当我使用Git时,我也倾向于拥有自己的存储库(这是一个SSH服务器,我可以在其中推送所有分支,甚至还在进行中尚未发布的工作).

我意识到Mercurial的分支方式与Git方式并不完全相同.但是,Mercurial是否有相同的工作流程,或者我只需改变我的方法?我怎样才能看到我正在使用的每个存储库与各自的分支(其中一些可能有共同点)的位置?

Mar*_*ler 6

这是一个很大的问题,所以我要选几点.我想你应该来IRC频道邮件列表寻求更多建议 - 我预测你的(进一步)问题将是讨论的一种性质,并且讨论那里的事情要好得多.

[...]更重要的是,我tip现在是我提交的最新版本,但是我没有相应的github-origin/master标签(无论是在我自己的提交之前还是在其他作者之后)做了更多改变).

不要过分强调tip标签.这是一个弃用的概念,当你有多个分支时,这意味着越来越少.主要问题是它只是存储库中最新的变更集,所以当你拉动时它会从(命名)分支跳转到(命名)分支.我们宁愿谈论default相反的和其他命名的分支/书签,因为这些标识符以更受控制的方式移动.

我怎样才能看到我正在使用的每个存储库与各自的分支(其中一些可能有共同点)的位置?

remotebranches扩展可以帮助你得到更混帐样的工作流程在这里.

但一般来说,如果你想在Mercurial中使用类似Git的分支,你应该查看书签.您创建的命名分支与您使用hg branch的分支几乎没有相似之处git branch(Git缺少Mercurial的命名分支概念).

使用hg incominghg outgoing查看存储库之间的差异.这就是我通常看到需要从另一个克隆中拉出或推送到另一个克隆的方式.