将Mercurial存储库转换为Git

我已经通过快速导出尝试hg2git,我已经尝试过hg-git。

两者都没有成功。 hg2git实际上工作,但我不得不问一个运行Unix机器的朋友去做。 这使整个文件中的所有换行都搞砸了。

hg-git只是因为一些libzip压缩错误而失败。

有没有人有任何成功将hg repo转换为Windows上的git?

要清楚,我不关心互操作。 我想把整个回购从gg转移到git上,带着我的历史。 我不需要来回推送更改 – 只能转换一次。

提前致谢!

以下在我的Mac上成功地出口一个Mercurial回购Git(具有完整的分支机构):

mkdir myrepo; cd myrepo; git clone git://repo.or.cz/fast-export.git . rm -rf .git .gitignore git init ./hg-fast-export.sh -r ../path/to/local/hg/repo git clean -f # remove fast-export files 

Windows 7 64位解决scheme

如何将一个Mercurial回购转换成一个Git回购。

这是我曾经弄清楚的最常见的事件之一,但我根本不是一个Python家伙。

我的开始环境

  • Visual Studio 2010/2012
  • TortoiseHg 2.8.2; 包括Mercurial 2.6.3和Python 2.7.3
  • Git 1.8.3

我得到的错误

  • 找不到Python
  • 在Python中找不到Mercurial模块
  • Easy_Install不存在
  • 无法编译Mercurial模块

我做了什么

  • 只好安装Python27 stand( http://www.python.org/
  • 确保将path放在环境variables的path中
  • 只好安装Easy_Install( http://sourceforge.net/projects/pywin32/files/
  • 确保Python脚本path也在环境variables中
  • 并得到这个…必须去MSDN和下载完整版本的Visual Studio 2008,只安装C + +的64位选项打开(所以Easy_Install可以编译为Mercurial模块的Python),但我不能得到它使用Express版,因为无法find64位选项。

脚步

  • 在命令控制台(安装完毕后)
    • C:\ easy_install mercurial

(如果您安装了所有应用程序,请下载并编译Mercurial模块)

  • 在Git控制台
    • 按照@ mauvis-ledford和@benno的步骤(谢谢你们!!!)

下面是一个简单的例子,说明如何将Mercurial repo的本地克隆导出到GitHub。

首先,将hggit扩展名添加到~/.hgrc文件中,如果还没有这样做:

 [extensions] hggit = 

然后从Mercurial存储库的根目录运行以下命令:

 hg bookmark -r default master hg push -f git+ssh://git@github.com/bolinfest/plovr.git 

就个人而言,我必须在运行hg push时指定-f ,尽pipe我怀疑这是因为我的Mercurial回购中有一些复杂的分支。 您可能无法find您的迁移所需。

确保你的GitHub仓库有git+ssh: URI而不是git: URI。 (在新的GitHub UI中, git+ssh: URI有点难以find。)

根据您的回购大小,运行hg push可能需要一段时间,所以请耐心等待。 完成后,您应该能够在GitHub上看到您的项目。 在这个例子中,我的项目可以在https://github.com/bolinfest/plovr上find

正如你所期望的,现在任何人都可以克隆你的公共GitHub回购,如下所示:

 git clone git@github.com:bolinfest/plovr.git 

以下是在Windows上迁移的所有内容。

先决条件

  • 混帐
  • Mercurial或TortoiseHg
  • Python 2.7(3.x将不起作用)

在安装过程中,允许绑定到.sh文件。
确保所有工具在PATH环境variables中都可用。

移民

  1. 打开cmd.exe
  2. mkdir c:\git_work
  3. cd c:\git_work
  4. git clone http://repo.or.cz/r/fast-export.git
    这将创build文件夹:c:\ git_work \ fast-export \
  5. 现在你需要python的mercurial libs。 要么从这里得到他们执行以下步骤。
    编辑c:\ git_work \ fast-export \ hg-fast-export.py:

     import sys # move this line up here # Add a new line that imports [mercurial libraries][2] from this zip: sys.path.append(r'C:\Program Files\TortoiseHg\library.zip') # ...above the old line: from mercurial import node 
  6. mkdir MyNewGitRepo

  7. 将快速导出的内容复制到MyNewGitRepo,忽略.git *
  8. hg-fast-import.sh -rc:\Path\To\MyOldHgRepo
  9. 如果这个失败,并且“Error:repository至less有一个未命名的头……”,则用参数:–force调用最后一行
  10. 删除迁移脚本:

     git clean -n # see what would happen git clean -f # delete migration files 
  11. 通过重置索引和工作树来恢复丢失的文件。

     git reset --hard 

截至今天,git发行版包含一个将mercurial仓库转换为git的工具, hg-to-git 。 如果你安装了最近的git版本,它就在那里。 为我工作得很好。

如果您碰巧使用GitHub, 并且您的Mercurial repo通过HTTP / HTTPS可用…

在使用快速导入(一个伟大的工具,转换我的回购没有问题)的过程中,并推动我的新的git回购从我的开发盒GitHub,我注意到一个选项“导入代码从另一个库”在“快速设置“GitHub上的git回购部分。

我testing了它,并获得了与使用快速导入相同的结果。 在我的情况下,使用GitHub导入选项比快速导入更容易(再次,没有反对该工具,不,我不工作的GitHub)。 为我工作的步骤是:

  1. 创build一个新的GitHub回购
  2. 回购一旦创build,在快速设置中select“导入代码”选项
  3. input公共可用的hg,svn或tfs repo的URL,然后在“Github Importer”对话框中按“Begin import”

如果你真的只是想这样做,一旦你可以使用像这样的hg export

 hg export 0:tip -o all-changesets-in-one.patch 

或者如果git更喜欢每个文件只有一个补丁,您可以为每个变更集创build一个,如下所示:

 hg export 0:tip -o changeset-%r.patch 

推测git apply可以采取这些格式之一。

你尝试过裁缝吗? 它几乎可以将任何东西都转换成任何东西,就像VCS一样,甚至可以递增地执行(也就是说,只需转换一次,然后将新的提交从源文件添加到目标文件,而不需要从头开始重新转换)。 你现在可能不需要它,但它仍然是一个很好的function。

在没有本地进程的情况下转换Git和Hg的简单方法是打开一个免费的KilnHg / Fogbugz账户 ,创build一个私有的repo,推入一个格式然后拉入另一个格式,它可以与Git&Hg和(should )做无缝转换。

似乎没有任何理由你不能在Windows上运行hg2git。 它是一个窗口的python。 只要确保正确的库在那里,并在窗口框中运行它。

我尝试了一些其他的答案,没有太多的运气。 经过多次的试验和错误之后,这是一个非常简单的方法:

首先, 下载hggit扩展名并将其添加到您的〜/ .hgrc或mercurial.ini文件中(如果尚未这样做):

 [extensions] hggit=\path\to\hg-git 

对于每个想要带到Git中的分支,在分支的顶端添加一个Hg书签:

 hg bookmarks hg-default 

然后使用hggit通过运行hg gexport在与当前的Hg回购相同的文件夹中创build一个git回购。 一个.git文件夹将作为结果被添加。 当你从仓库中删除.hg文件夹时,你会留下一个本地的git仓库。

如果有人在OS X上使用Homebrew,并希望知道如何使其正常工作,请参阅此处的文章: http : //www.ccannon.net/mercurial-to-git-conversion-with-homebrew.html