hg git 同步的一种方式

One way hg to git sync

我有一个 Mercurial 存储库,其中包含一个我正试图逐渐拆分的单体项目。在执行这些操作时,我想我会将新的子项目转换为 git,从而实现单向同步。

关于我在做什么的更多细节:

到目前为止,我尝试了几个工具,例如快速导出、mercurial hg hggit 插件。但是,我正在努力寻找好的分步工具。 (以及该线程中的几乎所有方法 Convert Mercurial project to Git

快速导出是给我最好结果的工具,我能够一次又一次地迁移项目,但是当我尝试重新同步时,我开始出现错误,比如分支在外部修改和多个头。

现在我已经更详细地解释了我的问题,我可以提出问题了。

什么是最好的方法和工具让我能够以单向方式进行 hg 到 git 迁移?

此外,如何确保我的 Mercurial 存储库配置正确以避免在迁移到 git 时出现任何潜在问题?

经过无数次尝试,我想我找到了一种以一致的方式做我想做的事情的方法。为了将来参考,这是以下步骤:

安装必要的工具

为 Windows

安装 Git

独立安装 Tortoise HG 或 Mercurial

安装Python 2.7(目前不支持快速导出Python 3.X)

打开命令行提示符(运行 作为管理员)。

检查是否可以 运行 git,mercurial 和 python 如下:

$ git

$ mercurial

$ python

如果您已经安装了上面的其他软件并且出现错误,您需要设置路径,在我的例子中我只需要为 Python 设置。所以我做了:

$ setx path "%path%;C:\Python27"

重新启动命令提示符,一切就绪。

安装快速导出并克隆 mercurial 和 git 存储库

创建一个干净的目录,以便将工作包含在其中(在我的例子中,除了同步项目之外,我不会将此目录中的存储库用于任何其他用途)。例如:

c:\syncprojects

从内部c:\syncprojects开始克隆快速导出

$ git clone https://github.com/frej/fast-export.git fast-export

然后克隆 mercurial 项目

$ hg clone https://bitbucket.org/user/mercurialrepo

然后克隆要同步到的 git 项目

$ git clone https://bitbucket.org/user/gitrepo gitrepo

它帮助我正确配置了作者文件,所以我做到了

$ cd mercurialrepo
$ hg log | grep user: | sort | uniq | sed 's/user: *//' > ../authors

然后打开在 c:\syncprojects 中创建的作者文件,确保作者文件与类似的内容相匹配:

bob=Bob Jones <bob@company.com>
bob@localhost=Bob Jones <bob@company.com>
bob <bob@company.com>=Bob Jones <bob@company.com>

下一步是开始实际迁移,对于这一步,我觉得使用 git bash 更舒服,所以我这样做了:在 windows 资源管理器中,右键单击 gitrepo 文件夹和 select "Git Bash here"

然后我让我的本地 git 回购区分大小写,这有助于这个过程,但它是一件好事,因为我 运行 过去遇到过区分大小写的文件夹的问题。只是做:

git config core.ignoreCase false 

触发同步

我终于做到了:

$ c:\syncprojects\fast-export\hg-fast-export.sh -r c:\syncprojects\mercurialrepo -A c:\syncprojects\authors --force

如果一切顺利(这不一定总是发生,出于多种原因,我在 mercurial 中遇到了问题,我尝试同步到 git 回购中的本地更改问题).

我们需要做的就是检查头部并将更改推送到远程,这样:

$ git checkout HEAD
$ git push -u origin master

下次您想要同步时,只需重复最后一部分:

$ c:\syncprojects\fast-export\hg-fast-export.sh -r c:\syncprojects\mercurialrepo -A c:\syncprojects\authors --force

$ git checkout HEAD

$ git push -u origin master

不幸的是,这些步骤并没有看起来那么快,但这是我发现的解决问题的更简洁、更一致的方法。

更多提示:

  • 我没有将任何新代码合并到新创建的 git 仓库中。
  • 直到我完全满意并且能够停止同步,我才会有一个 包含我日常所做的更改的分支,以及 定期将 master 合并回那个分支。
  • 不要使用这个repos进行开发,fast-export存储里面的数据 可能会丢失并使重新同步项目非常 很难实现。将存储库克隆到一个单独的位置(请 小心检查此回购协议中的其他分支 同样的原因)。