Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将mercurial repo及其子存储库迁移到git并保留历史的最佳方法?_Git_Mercurial_Migration_Git Submodules_Mercurial Subrepos - Fatal编程技术网

将mercurial repo及其子存储库迁移到git并保留历史的最佳方法?

将mercurial repo及其子存储库迁移到git并保留历史的最佳方法?,git,mercurial,migration,git-submodules,mercurial-subrepos,Git,Mercurial,Migration,Git Submodules,Mercurial Subrepos,我正在尝试将mercurial存储库迁移到git,但问题是mercurial存储库有子存储库(一些有分支),并且有很多合并和分支本身。我希望最终的git存储库保留所有这些历史记录,并且在签出存储库或其他分支的早期部分时保持正确和完整。我不需要新的存储库有子模块或子树,尽管我也会接受使用它的解决方案。我见过的一些方法将新repo顶部的所有子repo合并为分支,这意味着过去的签出并不包含子repo中的所有文件。我也尝试过将所有内容作为分支导入,将头部重置为过去,合并,并向上重新调整,但是合并太多,并

我正在尝试将mercurial存储库迁移到git,但问题是mercurial存储库有子存储库(一些有分支),并且有很多合并和分支本身。我希望最终的git存储库保留所有这些历史记录,并且在签出存储库或其他分支的早期部分时保持正确和完整。我不需要新的存储库有子模块或子树,尽管我也会接受使用它的解决方案。我见过的一些方法将新repo顶部的所有子repo合并为分支,这意味着过去的签出并不包含子repo中的所有文件。我也尝试过将所有内容作为分支导入,将头部重置为过去,合并,并向上重新调整,但是合并太多,并且会产生很多冲突,即使使用--preserve合并,所以我宁愿避免这种情况。我也找不到任何方法将git中的mercurial子存储库更新历史复制为子模块更新历史。有人有什么想法吗?谢谢。

也许您可以做一件事(但我不确定这是否可行),那就是使用hg git推送到一个空的git存储库

或者,您也可以考虑扩展以支持子回购转换为子模块。

有一个类似的问题(将带有子存储库的Mercurial项目移动到具有统一布局的Git),我打算采用两种方法:

  • 将您的子存储库转换为Mercurial中的统一项目布局-这里介绍了这一点:
  • 现在您可以轻松地迁移到Git,我发现官方文档是最好的资源,并提供了关于如何清理提交历史记录的详细说明(作者):

  • 我正准备亲自测试,并将根据结果更新此答案…

    免责声明:以下解决方案仅在您愿意将子回购折叠到主存储库中时有效,您可能会接受,也可能不会接受


    简而言之:将每个子回购转换为git,将主回购转换为git,并让git合并回购

  • 设置。它需要Python2.7和Mercurial 4.6

  • 对于每个次级回购:

  • 转换使用
  • 创建一个新目录来存放临时子repo
  • 初始化git:
    git init;git config core.ignoreCase false
  • 根据需要使用配置选项运行快速导出
  • 运行
    git reset--hard HEAD
    重新填充目录
  • 根据需要清除回购协议中的任何汞痕迹
  • 配置文件夹以准备迁移1
  • 提交子repo上的更改
  • 使用步骤2.1-2.3将主要回购从hg转换为git
  • 根据需要将.hgignore文件转换为.gitignore
  • 将更改提交到主回购协议
  • 使用以下步骤在每个子回购中合并:

  • 1例如,在我的例子中,初始文件夹结构如下:

    Main Repo
     |- SubRepo1
        L SubRepo1-Data
     |- SubRepo2
     L  OtherStuff
    
    转换后,新回购被配置为:

    SubRepo1 (master)
     L SubRepo1-Data
    
    因此,我们需要将文件夹级别添加到Subrepo中,使其类似于:

    SubRepo1 (master)
     L SubRepo1
       L SubRepo1-Data
    

    我可以使用hggit完成提交,但这完全忽略了子回购。我查看了git cinnabar,但它也没有subrepo支持。我以前已经转换过基本回购协议和所有子回购协议,但是还没有找到一个好方法来组合它们,同时能够看到包括子回购协议在内的所有文件的历史状态。
    SubRepo1 (master)
     L SubRepo1
       L SubRepo1-Data