将Mercurial项目转换为Git

我需要将一个mercurial项目转换成一个git项目,但我想保持提交历史不变。 我目前的解决scheme是只删除HM相关的文件,然后git init &&手动添加我需要的文件,但这不会保留历史。 有没有解决办法?

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

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的问题 。

更新:repo.or.cz不存在了,replace为GitHub repourl。

好吧,我终于解决了这个问题。 这是在Windows上使用TortoiseHg。 如果你没有使用,你可以在命令行上执行。

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

TortoiseHg设置

  1. 启用hggit

在这里输入图像描述

  1. 打开一个命令行,input一个目录。

  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仓库推到一个非裸仓库。

如果您想将现有的mercurial仓库导入到“GitHub”仓库,现在可以简单地使用这里提供的GitHub Importer [需要login]。 没有更多的快速出口乱七八糟(虽然它是一个非常好的工具)

你会得到你所有的提交分支标签完好无损。 另一个更酷的事情是,你也可以改变作者的email-id 。 看看下面的截图:

在这里输入图像描述

在这里输入图像描述

我的经验转换Mercurial Git的一些笔记。

1. hg-fast-export

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

错误:无法lockingref'refs / heads / stable':'refs / heads / stable / sub-branch-name'exists; 不能创build'refs / heads / stable'

hg-快速出口完成后,我结束了与截肢回购。 我认为这个回购有很多孤儿分支,而且快速出口需要一个有点理想化的回购。 这一切似乎有点粗糙的边缘,所以我转移到窑和谐( http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/

如上所示,窑炉和谐似乎并不存在于免费级别的账户中。 我可以selectGit-only和Mercurial-only回购,并且没有select切换。 我提出了一个支持票,如果他们答复,将分享结果。

3. hg-git

Hg-Git mercurial插件( http://hg-git.github.io/ )确实为我工作。 在Mac OSX上的FYI我通过macports安装了hg-git,如下所示:

  • sudo端口安装python27
  • sudo port select –set 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。

每当我第一次推动这个项目时,我都会失去所有新的变化。 这是因为这行代码只能被视为一个指导:

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

理论上说,默认的分支在推动git的时候可以被认为是高手,在我的情况下,我inheritance了一个使用“稳定”作为等价主的回购。 此外,我还发现,回购的提示是一个尚未与“稳定”分支合并的修补程序。

如果没有正确理解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中进行了一个可validation的等价项目,但是之前提到的所有孤儿分支都不见了。 我认为这不是太严重,但我可能会为此感到遗憾。 所以我最后的想法是保持原来的。

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

 hg book -r tip master hg push git+ssh://git@bitbucket.org:myaccount/myrepo.git 

另一个select是创build一个免费的Kiln账户 – 在git和hg之间进行一次往返,保留100%的元数据,所以你可以使用它来一次性转换或者使用它来访问一个仓库,使用你喜欢的任何一个客户端。

从:

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

迁移

这是一个相对简单的过程。 首先我们下载快速导出(最好的方法是通过它的Git仓库,我将它克隆到桌面),然后我们创build一个新的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 

运行快速导出后,您的项目将被迁移,您应该看到一长串的提交列表。 如果您看到错误,则可能与指定的Pythonpath不正确有关(请参阅上面的注释并针对您的系统进行自定义)。

就是这样,你完成了。

这将是一个更好的评论,对不起,我没有评论权限。

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

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

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

这移动了我们的hg项目,并保持提交历史不变。

我有一个类似的任务要做,但它包含了一些其他方面没有被其他答案覆盖的方面:

  • 我想转换所有 (我的情况:两个,或者一般来说:不止一个)我的回购分支。
  • 我有我的提交消息和文件名非ASCII和(是Windows用户)非UTF8编码的字符(好奇:德语umlaute)。

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

我用TortoiseHG尝试了hg-init, 这个答案给了我一个好的开始。 但它看起来像只转换当前分支,而不是一次(*)。 所以我读了hg-init文档和这个博客post并添加了

 [git] branch_bookmark_suffix=_bookmark 

我的mercurial.ini,并做到了

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

(对于要转换的每个分支重复第二行,如果在执行第三行之前碰巧做了另一个提交,则重复该行)。 这在.hg创build了一个文件夹git ,这个文件夹是所有导出的分支的一个纯粹的Git仓库。 我可以克隆这个回购,并根据需要有一个工作副本。

或几乎…

运行

 git status 

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

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

最后,回购已准备好推到Bitbucket 🙂

我也尝试了这个答案中提到的Githubimport商。 我使用Bitbucket作为源系统,Github做了很好的工作,即自动转换所有分支。 但是,在我的提交消息(Web-UI和本地)和文件名(仅限于Web-UI)中,它显示了所有非ASCII字符的'?'字符,而我可以像上面描述的那样修复文件名,如何处理提交消息,所以我更喜欢hg-init方法。 如果没有编码问题,Github导入器将是一个完美而快速的解决scheme(只要你有一个付费的Github帐户,或者只要把它从Github上下载到你的本地机器上就可以容忍你的repo是公开的)。


(*)所以看起来像之前我发现,我必须书签所有我想出口的分支机构。 如果你这样做,推到一个光秃秃的 (!)回购,就像链接的回答说,你得到所有的分支机构。