我需要将一个Mercurial项目转换为Git项目,但我希望保留提交历史记录。我的当前解决方案是仅删除与hg相关的文件,然后git init &&手动添加所需的文件,但这样无法保留历史记录。有没有解决办法?
我需要将一个Mercurial项目转换为Git项目,但我希望保留提交历史记录。我的当前解决方案是仅删除与hg相关的文件,然后git init &&手动添加所需的文件,但这样无法保留历史记录。有没有解决办法?
您可以尝试使用fast-export:
cd ~
git clone https://github.com/frej/fast-export.git
git init git_repo
cd git_repo
~/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo
git checkout HEAD
此外,还要看看这个 SO 问题。
如果您使用的是低于4.6版本的 Mercurial,则adrihanu可以帮上您的忙:
正如他在评论中所述:"如果您使用的是Mercurial < 4.6并且出现了"revsymbol not found"错误,请更新您的Mercurial或通过在~/fast-export目录中运行git checkout tags/v180317来降级 fast-export。"。
-A
。 - David Mohundro--force
选项来处理损坏的树。 - iurii好的,我终于搞清楚了。这是在Windows上使用TortoiseHg。如果您没有使用它,可以在命令行上执行。
hggit
:打开命令行,进入一个空的目录。
git init --bare .git
(如果您不使用裸库,您将收到类似于abort:git remote error:refs / heads / master failed to update
的错误消息)
cd
到您的Mercurial存储库。
hg bookmarks hg
hg push c:/path/to/your/git/repo
在Git目录中:git config --bool core.bare false
(别问我为什么。关于“工作树”的事情。Git非常不友好。我发誓编写实际代码比使用Git更容易。
希望它能正常工作,然后您可以从新的git存储库推送到非裸库。
hg.exe
,而不是来自命令行安装的版本。如果出现错误_No module named hggit_,请尝试完全限定hg命令:"C:\Program Files\TortoiseHg\hg" push c:/path/to/your/git/rep
. - Javaruhg bookmark -r default master
” 比“ hg bookmarks hg
”更好吗? - Heikki我在将Mercurial转换为Git的过程中做了一些笔记。
使用hg-fast-export失败了,我需要像上面提到的那样使用--force选项。接下来我遇到了以下错误:
error: cannot lock ref 'refs/heads/stable': 'refs/heads/stable/sub-branch-name' exists; cannot create 'refs/heads/stable'
完成hg-fast-export后,我最终得到了一个被截断的仓库。我认为这个仓库有很多孤立分支,并且hg-fast-export需要一个比较理想化的仓库。这一切似乎都有点粗糙,所以我转向了Kiln Harmony(http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/)
如上面建议的那样,在免费帐户上似乎不存在Kiln Harmony。我可以选择只使用Git或Mercurial存储库,没有切换选项。我提交了一个支持票,并将分享结果(如果他们回复我的话)。
Hg-Git Mercurial插件(http://hg-git.github.io/)对我起作用了。FYI,在Mac OSX上,我通过macports安装了hg-git如下:
.hgrc需要这些行:
[ui]
username = Name Surname <me@mydomain.com>
[extensions]
hgext.bookmarks =
hggit =
接下来我成功地完成了:
hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git
以上所有方法都很直接,我只是坚持使用它们,因为让团队正确使用Git花费了足够长的时间。
在第三步中首次推送项目后,我发现所有新更改都丢失了。这是因为这行代码必须被视为仅供参考:
$ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created
理论上,在推送到git时,可以将默认分支视为主分支,而在我的情况下,我继承了一个将“stable”用作主分支等效的存储库。此外,我还发现该存储库的末端是一个尚未与“stable”分支合并的热修复。
如果没有正确理解Mercurial和要转换的存储库,最好不要进行转换。
为了使存储库准备好进行第二次转换尝试,我进行了以下操作:
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
我有一个类似的任务需要完成,但其中一些方面并没有被其他答案充分覆盖:
我没有尝试使用fast-export和hg-fast-export,因为它们要求您在计算机上安装Python和一些Mercurial Python模块,而我没有这些。
我尝试了使用TortoiseHG的hg-init,并且这个答案给了我一个好的开始。但是看起来它只转换了当前分支,而不是全部分支(*)。所以我阅读了hg-init文档和这篇博客文章并添加了以下内容:
[git]
branch_bookmark_suffix=_bookmark
我对我的mercurial.ini进行了修改,并执行了操作
hg bookmarks -r default master
hg bookmarks -r my_branch my_branch_bookmark
hg gexport
对于每个您想要转换的分支,重复第2行,并在执行第3行之前再次重复。这将在.hg
文件夹内创建一个名为git
的文件夹,其中包含所有导出的分支的裸Git repo。我可以克隆此存储库并得到所需的工作副本。
或几乎是...
运行
git status
在我的工作副本中,所有文件名中包含非ASCII字符的文件都被显示为未跟踪的文件。因此,我继续研究并按照这个建议进行操作:
git rm -rf --cached \*
git add --all
git commit
来源:
http://hivelogic.com/articles/converting-from-mercurial-to-git
迁移
这是一个相对简单的过程。首先,我们下载fast-export(最好通过其Git存储库下载,我会将其克隆到桌面),然后创建一个新的git存储库,执行迁移并检出HEAD。在命令行上,就像这样:
cd ~/Desktop
git clone git://repo.or.cz/fast-export.git
git init git_repo
cd git_repo
~/Desktop/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo
git checkout HEAD
您应该会看到在运行fast-export之后,您的项目被迁移时出现了大量的提交列表。如果您看到错误,它们可能与未正确指定Python路径有关(请参见上面的注释并根据您的系统进行自定义)。另一个选择是创建一个免费的Kiln账户——Kiln可以在Git和Hg之间进行往返转换,并保留100%的元数据,因此您可以将其用于一次性转换或使用它来访问您喜欢的任何客户端的存储库。
很抱歉我没有评论权限,否则这将更好。
@mar10的评论是我实现此操作所需的关键部分。
请注意,“/path/to/old/mercurial_repo”必须是文件系统上的路径(而不是URL),因此您必须先克隆原始存储库。 - mar10 Dec 27 '13 at 16:30
这个评论是针对解决我的答案的,https://dev59.com/zmgv5IYBdhLWcg3wSe62#10710294 这个答案与在这里标记为正确的答案相同,https://dev59.com/fWQo5IYBdhLWcg3wdPK8#16037861
这将我们的hg项目移动到了git,并保留了提交历史记录。