将Mercurial项目转换为Git [复制]

问题描述 投票:247回答:8

这个问题在这里已有答案:

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

git mercurial
8个回答
256
投票

你可以尝试使用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

还可以看看this SO question


76
投票

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

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

TortoiseHg Settings

  1. 启用hggit

enter image description here

  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推向非裸机版。


60
投票

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

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

enter image description here

enter image description here


16
投票

关于将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-GO

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 <[email protected]>

[extensions]
hgext.bookmarks =
hggit = 

然后我成功了:

hg push git+ssh://[email protected]:myaccount/myrepo.git

警告:了解你的回购

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

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

$ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created

理论上说,当推送到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://[email protected]:myaccount/myrepo.git

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

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

hg book -r tip master
hg push git+ssh://[email protected]:myaccount/myrepo.git

8
投票

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


8
投票

从:

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

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

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


8
投票

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

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

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

我确实用TortoiseHG尝试了hg-init,this answer给了我一个好的开始。但它看起来只是转换当前分支,而不是一次转换(*)。所以我读了hg-init docsthis blog post并补充说

[git]  
branch_bookmark_suffix=_bookmark

我的mercurial.ini,并做了

hg bookmarks -r default master  
hg bookmarks -r my_branch my_branch_bookmark  
hg gexport

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

或者差不多......

运行

git status

在我的工作副本上显示所有名称中包含非ASCII字符的文件为未跟踪文件。所以我继续研究并关注this advice

git rm -rf --cached \*  
git add --all
git commit 

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

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


(*)所以它看起来像我之前发现我必须为我要导出的所有分支添加书签。如果你这样做并推送到一个裸(!)仓库,就像链接的答案所说的那样,你得到了所有的分支机构。


2
投票

作为评论,这会更好,抱歉,我没有评论权限。

@ mar10评论是我需要做的这个缺失的部分。

请注意,'/ path / to / old / mercurial_repo'必须是文件系统上的路径(而不是URL),因此您必须先克隆原始存储库。 - 2013年12月27日16:30

这个评论是关于为我解决这个问题的答案,https://stackoverflow.com/a/10710294/2148757与这里标记正确的答案相同,https://stackoverflow.com/a/16037861/2148757

这将我们的hg项目移动到git,提交历史记录保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.