我将 Mercurial 转换为 Git 的一些经验。
1。汞快速出口
使用 hg-fast-export 失败,我需要 --force 如上所述。接下来我得到了这个错误:
错误:无法锁定 ref 'refs/heads/stable':'refs/heads/stable/sub-branch-name' 存在;无法创建 'refs/heads/stable'
完成 hg-fast-export 后,我得到了一个截断的 repo。我认为这个 repo 有很多孤立的分支,hg-fast-export 需要一个有点理想化的 repo。这一切似乎有点粗糙,所以我转到了 Kiln Harmony (http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/)
2。窑炉
如上所述,Kiln Harmony 似乎不存在于免费层帐户上。我可以在仅 Git 和仅 Mercurial 存储库之间进行选择,并且没有切换选项。我提出了支持票,如果他们回复,我会分享结果。
3。 hg-git
Hg-Git mercurial 插件 (http://hg-git.github.io/) 确实对我有用。在 Mac OSX 上仅供参考,我通过 macports 安装了 hg-git,如下所示:
- sudo 端口安装 python27
- sudo 端口选择 --set python python27
- sudo 端口安装 py27-hggit
- vi ~/.hgrc
.hgrc 需要这些行:
[ui]
username = Name Surname <me@mydomain.com>
[extensions]
hgext.bookmarks =
hggit =
然后我成功了:
hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git
4。警告:了解你的回购
以上都是生硬的工具,我只是推进,因为花了足够的时间让团队正确使用 git。
在第一次按 (3) 推送项目时,我发现所有新更改都丢失了。这是因为这行代码只能作为参考:
$ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created
理论上,当推送到 git 时,默认分支可以被视为 master,在我的例子中,我继承了一个 repo,他们使用“stable”作为 master 的等价物。此外,我还发现 repo 的提示是尚未与“稳定”分支合并的修补程序。
如果没有正确理解 Mercurial 和要转换的 repo,最好不要进行转换。
为了让 repo 准备好进行第二次转换尝试,我执行了以下操作:
hg update -C stable
hg merge stable/hotfix-feature
hg ci -m "Merge with stable branch"
hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git
在此之后,我在 git 中有一个可验证的等效项目,但是我之前提到的所有孤立分支都消失了。我不认为这太严重,但我很可能会因为疏忽而后悔。因此,我最后的想法是保留原件。
编辑:如果你只想要git中的最新提交,这比上面的合并更简单:
hg book -r tip master
hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git