将带有子库的mercurial repo迁移到git的最佳方式,保留历史



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

也许您可以做的一件事(但我不确定这是否有效)是使用hg-git将其推送到空的git存储库。

或者,您还可以扩展git-cinnabar以支持子repo转换为子模块。

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

  1. 在Mercurial中将子存储库转换为统一的项目布局—这里介绍:将多个子存储库合并为一个,并在Mercurial
  2. 中保留历史记录
  3. 现在你可以很容易地迁移到Git,我发现官方文档是最好的资源,有一个很好的说明如何清理提交历史(作者):https://git-scm.com/book/en/v2/Git-and-Other-Systems-Migrating-to-Git Mercurial

我正准备自己测试这个,并将根据结果更新这个答案…

免责声明:以下解决方案仅在您愿意将子库折叠到主库中时才有效,这可能是您所接受的,也可能是不接受的。


简而言之:将每个子repo转换为git,将主repo转换为git,然后让git合并这些repo。

  1. 设置快速导出。它需要Python 2.7和Mercurial 4.6.

  2. 每个subrepo:

    1. 使用快速导出转换
      1. 创建一个新目录来存放临时子仓库
      2. 初始化git: git init; git config core.ignoreCase false;
    2. 使用所需的配置选项运行快速导出
  3. 运行git reset --hard HEAD重新填充目录
  4. 根据需要从repo中删除hg的任何痕迹
  5. 配置文件夹以准备迁移1
  6. 在subrepo上提交更改
  • 将主repo从hg转换为git,使用步骤2.1-2.3。
  • 根据需要将。hgignore文件转换为。gitignore
  • 将更改提交到主仓库
  • 合并每个子repo,使用这篇文章中的步骤
  • git remote add subrepo1 path/to/subrepo1
    git fetch subrepo1 --tags
    git merge subrepo1/master --allow-unrelated-histories
    git remote remove subrepo1
    

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

    Main Repo
     |- SubRepo1
        L SubRepo1-Data
     |- SubRepo2
     L  OtherStuff
    

    转换后,新的repo配置为:

    SubRepo1 (master)
     L SubRepo1-Data
    

    所以我们需要给subrepos添加一个文件夹级别,这样它们就像:

    SubRepo1 (master)
     L SubRepo1
       L SubRepo1-Data
    

    相关内容

    • 没有找到相关文章

    最新更新