将Git工作流转换为Mercurial

时间:2012-02-05 17:08:54

标签: git mercurial github dvcs 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

当我用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

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

* my_feature
  remotes/github-mine/my_feature

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

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

git fetch github-origin
git checkout -b temp
git rebase github-origin/master

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

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

以下是我尝试做的事情,基于此Command Equivalence Table

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

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

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

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

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

1 个答案:

答案 0 :(得分:6)

这是一个很大的问题,所以我要选几点。我认为你应该来IRC channelmailinglist获取更多建议 - 我预测你的(进一步)问题将是讨论的一种性质,并且在那里讨论事情要好得多。

  

[...]更重要的是,我的tip现在是我提交的最新版本,但是我没有相应的github-origin / master标签(无论是在我之前)如果另一位作者做了更多更改,则自己提交或之后。

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

  

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

remotebranches extension可能会帮助您在此处获得更像Git的工作流程。

但总的来说,如果你想在Mercurial中使用类似Git的分支,你应该调查bookmarks。您使用hg branch创建的named branches与使用git branch创建的分支几乎没有相似之处(Git缺少Mercurial的命名分支概念)。

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