December 24, 2014

将 mercurial 仓库转换成 git 仓库

起因

一般在github上找 vim 的仓库,都会被搜索引擎引导到这位的 vim 仓库。但是很可惜,这个仓库从 8 月 31 号后就没更新过,不知道仓库的作者是因为什么而没有同步 vim 的 mercurial 仓库

解决

因为 vim 的 mercurial 仓库 是用mercurial管理的,而github只提供了git支持。那么中间需要一个转换,不然只是单纯地git init,然后git commit,最后git push,是没有什么意义的,中间的许多变化、日志全没了。

谷歌一会后发现,stackoverflow或者是一些个人博客都基本是指向两个工具,一个是 hg-git,另一个是 hg-fast-export。当然也有提到 git-remote-hg,不选择这个工具,是因为这个工具要重新把仓库克隆一遍,而我的想法是直接在本地已经克隆下来的仓库里改改就行了,所以没采用这个工具。

hg-git其实挺麻烦的,最主要的是我没安装成功,或者说这个插件没能工作。

hg-fast-export相当简单,把其 github 仓库 克隆下来后,就可以使用了。我还参照了这位博主的博文 进行操作,他是在 mac 上进行操作的。

我把vim 仓库放在 source 文件夹下,然后新建一个仓库叫vim-mirrorgit init vim-mirror)。进入这个空仓库后,执行hg-fast-export.sh的命令,进行递归转化。转化的结果是相当不错,不仅把日志转换了,还把 tag 转换了。当然工具并不是完美的,后面会有一些 fatal 的东西,是关于仓库的分支的一些信息,不过基本不用打理这个。最后就是一个git checout HEAD就算转换完成了。当 mercurial 仓库有更新时重复执行这个输出命令就行了,它会自动更新。

过程如下:

cd source
git clone https://github.com/frej/fast-export.git
git init vim-mirror
cd vim-mirror
~/source/fast-export/hg-fast-export.sh -r ~/source/vim
git checout HEAD