Version control 单向hg到git同步

Version control 单向hg到git同步,version-control,mercurial,tortoisehg,hg-git,Version Control,Mercurial,Tortoisehg,Hg Git,我有一个mercurial存储库,其中包含一个我正试图逐步拆分的整体式项目。在进行这些操作时,我想我会将新的子项目转换为git,从而实现单向同步 关于我正在做的事情的更多细节: hg回购协议和新的git回购协议位于私人bitbucket云账户中 我希望在执行拆分时保留提交历史记录 我们所有的开发都是基于Windows的(尽管我愿意使用基于unix的系统进行迁移) 最初的回购协议已有7年历史,它有各种各样的标签、封闭的分支、一些带有不受支持的git字符的分支。但更重要的是,如果我只能迁移默认/主

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

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

  • hg回购协议和新的git回购协议位于私人bitbucket云账户中
  • 我希望在执行拆分时保留提交历史记录
  • 我们所有的开发都是基于Windows的(尽管我愿意使用基于unix的系统进行迁移)
  • 最初的回购协议已有7年历史,它有各种各样的标签、封闭的分支、一些带有不受支持的git字符的分支。但更重要的是,如果我只能迁移默认/主文件,我会很高兴(如果它能帮助我完成工作,并且不意味着丢失历史)
  • 随着我们逐渐转换回购协议中的一些项目(假设我有30个项目,我想逐步移动它们),我需要从hg到git进行单向同步。我不害怕合并,我很乐意让我的新回购工作在master之外,然后随着hg的变化重新调整基准
  • 我认为我们的mercurial回购协议配置不当(我看到了多个头等),但当我深入mercurial主干时,我已经超出了我的舒适区
到目前为止,我尝试了一些工具,比如快速导出、mercurial hggit插件。然而,我正在努力寻找好的一步一步的工具。(以及该线程中的几乎所有方法)

fast export是给我带来最佳效果的工具,我能够一次性迁移项目,但当我尝试重新同步时,我开始出现错误,比如外部修改分支和多个头部

既然我更详细地解释了我的问题,我就可以问这个问题了

对于我来说,实现从hg到git的单向迁移,最好的方法和工具是什么?


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

经过无数次尝试,我想我找到了一种方法,可以以一致的方式完成我想要的任务。以下步骤供将来参考:

安装必要的工具 安装Git for Windows

安装Ortoise HG或Mercurial单机版

安装Python2.7(fast export目前不支持Python3.X)

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

检查是否可以按如下方式运行git、mercurial和python:

$ git

$ mercurial

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

$ setx path "%path%;C:\Python27"
重新启动命令提示符,一切准备就绪

安装fast export并克隆mercurial和git repos 创建一个干净的目录,以便将工作包含在其中(在我的情况下,除了同步项目之外,我不会使用此目录中的repos)。e、 g:

从内部
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
它帮助我正确配置了一个authors文件,所以我做到了

$ 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>
触发同步 最后我做到了:

$ c:\syncprojects\fast-export\hg-fast-export.sh -r c:\syncprojects\mercurialrepo -A c:\syncprojects\authors --force
如果一切顺利(这不一定总是发生,因为多种原因,我与mercurial的负责人有问题,与我试图同步的git回购协议的本地更改有问题)

我们需要做的就是签出头部并将更改推送到remote,例如:

$ 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中
  • 直到我完全满意,并能够停止同步,我将有一个 包含我在日常工作中所做更改的分支,以及 定期将主节点合并回该分支
  • 不要将此回购用于开发,快速导出会在其中存储数据 回购协议可能会丢失,使重新同步项目非常困难 很难实现。在单独的位置克隆回购协议(请 在本回购协议中,请小心检查其他分支机构,以便 同样的原因)

@Alberto在我写这篇文章时,fast export有自己的回购协议,从那时起,他们似乎(正确地)转移到了github。我将用正确的回购协议更新帖子
$ 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