【问题标题】:Convert Mercurial project to Git [duplicate]将 Mercurial 项目转换为 Git [重复]
【发布时间】:2013-04-08 21:38:42
【问题描述】:

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

【问题讨论】:

  • 一个 git-hg 实用程序,用于签出和跟踪一个 mercurial repo。 github.com/offbytwo/git-hg
  • 您也可以尝试Kiln Harmony,它同时保留 git 和 mercurial 版本的 repo 并同步所有内容,因此两者都可以使用。
  • @Ian 和其他人。它实际上不是一个重复的问题,另一个问题是关于迁移特定文件夹,这个问题是关于整个 repo。尽管该问题的答案已发布到该问题,但这是一个不同的问题。应将其标记为相关问题。
  • 仅供参考,Kiln Harmony 已停产。

标签: git mercurial


【解决方案1】:

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


如果您使用低于 4.6 的 Mercurial 版本,adrihanu 支持您:

正如他在评论中所说:“如果您使用 Mercurial .

【讨论】:

  • 作为附加说明,如果您需要将 Mercurial 作者映射到 Git 作者,您还可以使用作者映射文件传入 -A
  • n.b.如果您还没有安装 Mercurial,请在执行第 5 步之前安装。 mercurial.selenic.com
  • 如果遇到“repository has at least one unnamed head”之类的错误,可以指定--force选项来处理损坏的树。
  • 不适用于 Windows。因此可能对 97% 的人都不起作用——可能值得一提的是,在这种情况下你可以使用 cygwin 或类似的东西(即使它有隐藏的依赖项)
  • @jheriko 不适用于 Windows。因此,可能对 97% 的人都不起作用 - 你提到的这个数字 (97%) 是 2005 年的。
【解决方案2】:

好的,我终于解决了这个问题。这是在 Windows 上使用 TortoiseHg。如果你不使用它,你可以在命令行上做。

  1. 安装 TortoiseHg
  2. 右键单击资源管理器中的空白区域,然后转到 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 存储库推送到非裸存储库。

【讨论】:

  • 推送对我来说一直失败,出现错误“dulwich.errors.RefFormatError: refs/heads/ref”。原来我有几个书签。删除每个书签后,它停止失败。
  • 根据hg-git 文档,“TortoiseHg 带有 hg-git”并且只需要启用(如上所示)。但是,它包含在 mercurial 的命令行版本中(如果需要,可以安装它)。如果您同时安装了 TortoiseHg 和 HG,您需要确保使用来自 TortoiseHg 的 hg.exe,而不是命令行安装的一种形式。如果您收到错误 No module named hggit,请尝试完全限定 hg 命令:"C:\Program Files\TortoiseHg\hg" push c:/path/to/your/git/rep
  • 请注意,这个方法似乎只导入当前签出的分支(我正在寻找将导入整个存储库的解决方案)。
  • hg bookmark -r default master 会不会比 hg bookmarks hg 更好?
  • 要让文件出现在 repo 中,执行:git checkout hg
【解决方案3】:

如果您想将现有的 mercurial 存储库导入“GitHub”存储库,您现在只需使用 GitHub Importer available here [需要登录]。不用再乱用 fast-export 等(虽然它是一个非常好的工具)

您的所有提交分支标签都会完好无损。另一件很酷的事情是,您也可以更改作者的电子邮件 ID。看看下面的截图:

【讨论】:

  • 它是否也迁移问题和维基?
  • @thomthom 不只有提交、分支和标签
  • 你需要一个 Github 上的付费计划来创建私有存储库。当然,如果您要转换的是公共源代码树,那也不是问题。
  • @Åsmund 也可以使用该工具,克隆 git,然后删除公共 repo,如果只是担心代码未准备好时公开暴露
  • 您知道如何上传和转换本地 mercurial 存储库吗?
【解决方案4】:

我将 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

【讨论】:

  • Fog Creek 回复了我的支持票,确认 Kiln Harmony 不再可用。
【解决方案5】:

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

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

我没有尝试 fast-export 和 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

(对要转换的每个分支重复第 2 行,如果在执行第 3 行之前碰巧进行了另一次提交,请再次重复)。这会在.hg 中创建一个文件夹git,结果证明这是一个包含所有导出分支的裸Git 存储库。我可以克隆这个 repo 并根据需要拥有一个工作副本。

或者几乎……

跑步

git status

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

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

最后,repo 准备好被推送到 Bitbucket :-)

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


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

【讨论】:

  • 要解决 hg-fast-export 的编码问题(不确定 github 导入器),您可以像这样传递参数 'e':-e cp1251
  • 要解决 hg-fast-export 的文件名编码问题,您可以使用 '--fe' 选项,例如 --fe cp1251
【解决方案6】:

发件人:

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

在运行快速导出后迁移项目时,您应该会看到一长串提交。如果您看到错误,它们可能与不正确指定的 Python 路径有关(请参阅上面的注释并针对您的系统进行自定义)。

就是这样,你完成了。

【讨论】:

  • 这对我有用,但我必须添加一个步骤。除了最新版本的 Mercurial(不能通过 apt 获得)外,所有版本的快速导出都中断了,因此您要么必须手动安装闪亮的新 Mercurial >4.6,要么只需通过添加git checkout 19aa906 作为新步骤来降级快速导出上面的 3 以到达最后一次有效的提交
【解决方案7】:

另一种选择是创建一个免费的 Kiln 帐户——在 git 和 hg 之间进行 kiln 往返,并保留 100% 元数据,因此您可以使用它进行一次转换或使用您喜欢的任何客户端访问存储库。

【讨论】:

  • 窑如何转化?
  • Kiln 存储库可供 git 和 hg 使用。因此,您可以从一个客户端导入,然后从另一个客户端导出,次数不限。
  • Kiln Harmony 在持续的时候非常好,但它是 2016 年 9 月的 shut down。(而且 Kiln 的免费层将在下个月关闭。)
  • 窑最近被卖掉了,从那以后有很多停机时间。他们的状态页面并没有反映大部分内容,但大约每月一次。仅在您绝对需要 Mercurial 并且找不到其他主机时才推荐。
【解决方案8】:

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

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

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

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

这将我们的 hg 项目移动到 git 并保留完整的提交历史记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多