一种方法hg同步git

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一种方法hg同步git相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

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

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

答案

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

安装必要的工具

安装Git for Windows

安装Tortoise HG或Mercurial独立版

安装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 Bash here”

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

git config core.ignoreCase false 

触发同步

最后我做了:

$ c:syncprojectsfast-exporthg-fast-export.sh -r c:syncprojectsmercurialrepo -A c:syncprojectsauthors --force

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

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

$ git checkout HEAD
$ git push -u origin master

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

$ c:syncprojectsfast-exporthg-fast-export.sh -r c:syncprojectsmercurialrepo -A c:syncprojectsauthors --force

$ git checkout HEAD

$ git push -u origin master

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

还有一些提示:

  • 我没有在新创建的git仓库中合并任何新代码。
  • 在我完全满意并且能够停止同步之前,我将有一个分支,其中包含我在日常工作中所做的更改,并定期将主程序合并到该分支中。
  • 不要使用此repos进行开发,快速导出将数据存储在可能丢失的存储库中,并使重新同步项目很难实现。在一个单独的位置克隆回购(因为同样的原因,请注意检查此回购中的其他分支)。

以上是关于一种方法hg同步git的主要内容,如果未能解决你的问题,请参考以下文章

合并:Hg/Git 与 SVN

CTF常见源码泄漏总结

hg命令

“git log --graph”或“hg graphlog”如何工作?

从Hg迁移到Git

hg和git命令对照表