将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中都可用。
移民
- 打开cmd.exe
-
mkdir c:\git_work
-
cd c:\git_work
-
git clone http://repo.or.cz/r/fast-export.git
这将创build文件夹:c:\ git_work \ fast-export \ -
现在你需要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
-
mkdir MyNewGitRepo
- 将快速导出的内容复制到MyNewGitRepo,忽略.git *
-
hg-fast-import.sh -rc:\Path\To\MyOldHgRepo
- 如果这个失败,并且“Error:repository至less有一个未命名的头……”,则用参数:–force调用最后一行
-
删除迁移脚本:
git clean -n # see what would happen git clean -f # delete migration files
-
通过重置索引和工作树来恢复丢失的文件。
git reset --hard
截至今天,git发行版包含一个将mercurial仓库转换为git的工具, hg-to-git 。 如果你安装了最近的git版本,它就在那里。 为我工作得很好。
如果您碰巧使用GitHub, 并且您的Mercurial repo通过HTTP / HTTPS可用…
在使用快速导入(一个伟大的工具,转换我的回购没有问题)的过程中,并推动我的新的git回购从我的开发盒GitHub,我注意到一个选项“导入代码从另一个库”在“快速设置“GitHub上的git回购部分。
我testing了它,并获得了与使用快速导入相同的结果。 在我的情况下,使用GitHub导入选项比快速导入更容易(再次,没有反对该工具,不,我不工作的GitHub)。 为我工作的步骤是:
- 创build一个新的GitHub回购
- 回购一旦创build,在快速设置中select“导入代码”选项
- 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