将Mercurial项目转换为Git

gan*_*olf 265 git mercurial

我需要将mercurial项目转换为git项目,但我希望保持提交历史不变.我目前的解决方案是只删除hg相关文件,然后git init &&手动添加我需要的文件,但这不会保留历史记录.这有什么解决方案吗?

ale*_*oze 266

您可以尝试使用快速导出:

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
Run Code Online (Sandbox Code Playgroud)

另外看看这个SO问题.

  • 不适用于Windows的开箱即用.因此,对于97%的人来说也可能不起作用 - 可能值得一提的是,在这种情况下你可以使用cygwin或类似的东西(即使它有隐藏的依赖关系) (13认同)
  • 如果您还没有,请在执行步骤5之前安装Mercurial.http://mercurial.selenic.com/ (11认同)
  • 如果您有"存储库至少有一个未命名的头"这样的错误,您可以指定`--force`选项来处理损坏的树. (6认同)
  • @jheriko _不能开箱即用.因此,97%的人可能无法工作_ - 你提到的那个数字(97%)来自2005年. (6认同)
  • 另外请注意,如果需要将Mercurial作者映射到Git作者,您还可以使用作者地图文件传入`-A`. (5认同)
  • 如果您使用 **Mercurial < 4.6** 并且出现 **"revsymbol not found"** 错误。您需要通过在 _~/fast-export_ 目录中运行 `git checkout tags/v180317` 来更新 _Mercurial_ 或降级 _fast-export_。 (3认同)
  • 我刚刚为我的psutil项目做了这个,但标签和分支还没有被迁移. (2认同)
  • `错误:路径规范'HEAD'与 git 已知的任何文件都不匹配。` (2认同)
  • 我在 Windows 上,这个解决方案不起作用 (2认同)
  • 不适用于 mac 操作系统。 (2认同)

Tim*_*mmm 84

好的,我终于解决了这个问题.这是在Windows上使用TortoiseHg.如果您没有使用它,您可以在命令行上执行此操作.

  1. 安装TortoiseHg
  2. 右键单击资源管理器中的空白区域,然后转到TortoiseHg设置:

TortoiseHg设置

  1. 启用hggit:

在此输入图像描述

  1. 打开命令行,输入一个目录.

  2. git init --bare .git (如果你不使用裸仓库,你会收到类似的错误 abort: git remote error: refs/heads/master failed to update

  3. cd 到您的Mercurial存储库.

  4. hg bookmarks hg

  5. hg push c:/path/to/your/git/repo

  6. 在Git目录中:( git config --bool core.bare false 不要问我为什么.关于"工作树"的事情.Git非常不友好.我发誓写实际代码比使用Git更容易.)

希望它能够工作,然后你可以从新的git repo推向非裸机版.

  • `hg bookmark -r default master`不会比`hg bookmarks hg`更好吗? (10认同)
  • 根据[hg-git](http://hg-git.github.io/)文档,"TortoiseHg附带hg-git",只需要启用(如上所示).但是,它不是**不包含在命令行版本的mercurial中(如果需要可以安装它).如果您同时安装了TortoiseHg和HG,则需要确保使用TortoiseHg中的`hg.exe`,而不是命令行安装中的`hg.exe`.如果你得到名为hggit_的错误_No模块,请尝试完全限定hg命令:`"C:\ Program Files\TortoiseHg\hg"push c:/ path/to/your/git/rep` (6认同)
  • 推送时保持失败,错误"dulwich.errors.RefFormatError:refs/heads/ref".事实证明我有几个书签.删除每个书签后,它停止了失败. (3认同)
  • 要使文件显示在存储库中,请执行以下操作:git checkout hg (3认同)
  • 请注意,此方法似乎仅导入当前签出的分支(我正在寻找将导入整个存储库的解决方案)。 (2认同)

atu*_*tri 72

如果要将现有的mercurial存储库导入"GitHub"存储库,现在只需使用此处提供的GitHub Importer [需要登录].没有更多的麻烦与快速出口等(虽然它是一个非常好的工具)

您将完整地提交所有提交,分支标签.更酷的是,您也可以更改作者的电子邮件ID.查看以下截图:

在此输入图像描述

在此输入图像描述

  • 您知道如何上传和转换本地 mercurial 存储库吗? (4认同)
  • 您需要在 Github 上付费计划来创建私有存储库。当然,如果您要转换的是公共源代码树,那也不是问题。 (2认同)

Dio*_*ter 20

关于将Mercurial转换为Git的经验的一些注释.

1. hg-fast-export

使用hg-fast-export失败,我需要--force如上所述.接下来我收到了这个错误:

错误:无法锁定ref'refs/heads/stable':'refs/heads/stable/sub-branch-name'存在; 无法创建'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-only和Mercurial-only repos之间进行选择,而且没有切换选项.我提出了支持票,如果他们回复,我会分享结果.

3. hg-git

Hg-Git mercurial插件(http://hg-git.github.io/)确实对我有用.在Mac OSX上我是通过macports安装hg-git,如下所示:

  • sudo port安装python27
  • sudo port select --set python python27
  • sudo port安装py27-hggit
  • vi~/.hgrc

.hgrc需要这些行:

[ui]
username = Name Surname <me@mydomain.com>

[extensions]
hgext.bookmarks =
hggit = 
Run Code Online (Sandbox Code Playgroud)

然后我成功了:

hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git
Run Code Online (Sandbox Code Playgroud)

警告:了解你的回购

以上所有都是钝器,我只是推进,因为它花了足够的时间让团队正确使用git.

在第一次推动项目(3)后,我最终失去了所有新的变化.这是因为这行代码必须仅作为指南:

$ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created
Run Code Online (Sandbox Code Playgroud)

理论上说,当推送到git时,默认分支可以被认为是主要的,在我的情况下,我继承了一个repo,他们使用'stable'作为master的等价物.此外,我还发现repo的尖端是一个尚未与'stable'分支合并的修补程序.

如果没有正确理解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
Run Code Online (Sandbox Code Playgroud)

在此之后,我在git中有一个可验证的等效项目,但是我之前提到的所有孤立的分支都已消失了.我不认为这太严重了,但我可能会因为疏忽而对此感到遗憾.因此,我最后的想法是保留原作.

编辑:如果你只想在git中进行最新的提交,这比上面的合并更简单:

hg book -r tip master
hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git
Run Code Online (Sandbox Code Playgroud)

  • Fog Creek回复了我的支持票,证实Kiln Harmony已不再可用. (5认同)

Rec*_*Hou 10

从:

http://hivelogic.com/articles/converting-from-mercurial-to-git

迁移

这是一个相对简单的过程.首先我们下载快速导出(最好的方法是通过它的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
Run Code Online (Sandbox Code Playgroud)

在运行快速导出后,您应该看到一个很长的提交列表,因为您的项目已迁移.如果您看到错误,则可能与未正确指定的Python路径有关(请参阅上面的注释并为您的系统自定义).

就是这样,你已经完成了.

  • 这对我有用,但我必须添加一个步骤。除最新版本的 Mercurial 之外的所有版本的 fast-export 都崩溃了(无法通过 apt 获得),因此您要么必须手动安装闪亮的新 Mercurial &gt;4.6,要么通过添加“git checkout 19aa906”作为降级快速导出上面的新步骤 3 到达最后一次有效的提交 (2认同)

Mat*_*ias 10

我有类似的任务要做,但它包含了其他答案未充分涵盖的一些方面:

  • 我想转换我的仓库中的所有(在我的情况下:两个,或一般:多个)分支.
  • 我的提交消息和文件名中有非ASCII和(是Windows用户)非UTF8编码的字符(对于好奇的:德语变音符号).

我没有尝试快速导出和hg-fast-export,因为它们要求你的机器上有Python和一些Mercurial Python模块,我没有.

我确实尝试过使用TortoiseHG的hg-init,这个答案给了我一个良好的开端.但它看起来只是转换当前分支,而不是一次转换(*).所以我阅读了hg-init文档这篇博客文章并添加了

[git]  
branch_bookmark_suffix=_bookmark
Run Code Online (Sandbox Code Playgroud)

我的mercurial.ini,并做了

hg bookmarks -r default master  
hg bookmarks -r my_branch my_branch_bookmark  
hg gexport
Run Code Online (Sandbox Code Playgroud)

(对于要转换的每个分支重复第二行,如果在执行第3行之前碰巧再进行一次提交,则重复一次).这会git.hg其中创建一个文件夹,结果是一个包含所有导出分支的裸Git仓库.我可以克隆这个回购,并根据需要有一个工作副本.

或者差不多......

运行

git status
Run Code Online (Sandbox Code Playgroud)

在我的工作副本上显示所有名称中包含非ASCII字符的文件为未跟踪文件.所以我继续研究并遵循这个建议:

git rm -rf --cached \*  
git add --all
git commit 
Run Code Online (Sandbox Code Playgroud)

最后,回购已准备好被推到Bitbucket :-)

我也试过这个答案中提到的Github导入器.我使用Bitbucket作为源系统,Github做得相当不错,即它自动转换了所有分支.但是,它显示'?' - 我的提交消息(Web-UI和本地)和文件名(仅限Web-UI)中的所有非ASCII字符的字符,虽然我可以修复上面描述的文件名,但我不知道如何处理提交消息,所以我更喜欢hg-init方法.如果没有编码问题,Github导入器将是一个完美而快速的解决方案(只要你有一个付费的Github帐户,或者可以容忍你的repo是公共的,只要它从Github拉到你的本地机器就可以了).


(*)所以我发现我必须为我要导出的所有分支添加书签之前.如果你这样做并推送到一个(!)回购,就像链接的答案所说,你得到所有分支.


Ry4*_*ase 7

另一个选择是创建一个免费的Kiln帐户 - git和hg之间的窑回程,具有100%的元数据保留,因此您可以使用它进行一次转换或使用它来使用您喜欢的任何客户端访问存储库.

  • 你如何使用窑进行转换? (6认同)
  • Kiln Harmony在它持续时非常好,但它已于2016年9月[关闭](http://help.fogcreek.com/how-to-disable-kiln-harmony-on-a-repository/).(和窑的免费等级将在下个月关闭.) (3认同)