hg to git sync的一种方式

时间:2017-07-12 10:31:53

标签: version-control mercurial tortoisehg hg-git

我有一个mercurial存储库,其中包含我试图逐渐拆分的整体项目。在做这些时,我想我会将新的子项目转换为git,因此单向同步。

关于我正在做的事情的更多细节:

  • hg repo和新的git repos位于私人bitbucket云帐户中。
  • 我想在执行拆分时保留提交历史记录
  • 我们所有的开发都是基于Windows的(虽然我愿意使用基于unix的系统进行迁移)
  • 最初的回购是7岁,它有各种标签,封闭的分支,一些分支,不支持的git字符。但更重要的是,如果我只能迁移默认/主人(如果它可以帮助我完成工作并且不意味着丢失历史记录),我很高兴。
  • 当我们逐渐转换repo中的一些项目时(假设我有30个项目,我想逐步移动它们)我需要做一种从hg到git的同步方式。我并不害怕合并,我很乐意让我的新回购工作在主人之外工作,然后在我们去的时候用hg更改进行改装。
  • 我明白我们的mercurial repo没有正确配置(我看到了多个头等)但是当我深入到mercurial主干中时,我在我的舒适区之外。

到目前为止,我尝试了一些工具,例如fast-export,mercurial hg hggit插件。但是我很难找到好的一步一步的工具。 (以及此线程中的几乎所有方法Convert Mercurial project to Git

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

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

使用单向hg到git迁移的最佳方法和工具是什么?

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

1 个答案:

答案 0 :(得分:3)

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

安装必要的工具

安装Git for Windows

安装Tortoise HG或Mercurial standalone

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

打开命令行提示符(以管理员身份运行)。

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

$ git

$ mercurial

$ python

如果您已经安装了上面的其他内容并且您遇到错误,则需要设置路径,在我的情况下,我只需要为Python执行此操作。所以我做了:

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

重新启动命令提示符,一切都准备好了。

安装快速导出并克隆mercurial和git repos

创建一个干净的目录,以便工作将包含在那里(在我的情况下,除了同步项目之外,我不会在此目录中使用repos)。例如:

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中创建的authors文件,确保authors文件与此类似:

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文件夹并选择“混帐击这里”

然后我使我的本地git repo区分大小写,这对过程很有帮助,但它是一件好事,因为我在过去遇到了区分大小写的文件夹的问题。只是做:

git config core.ignoreCase false 

触发同步

最后我做了:

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

如果一切顺利(并且这不一定总是发生,由于多种原因,我在mercurial中遇到问题,我试图同步到git repo中的本地更改问题)。

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

$ 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 repo中合并任何新代码。
  • 直到我完全满意并且能够停止同步,我才会有 包含我在日常工作中所做更改的分支 定期将主人合并回该分支。
  • 不要使用此repos进行开发,快速导出存储数据 可能会丢失的回购并重新进行重新同步项目 很难实现。在一个单独的位置克隆回购(并请 小心检查这个回购中的其他分支 同样的原因)。