我试图将一个mercurial存储库迁移到git,但问题是mercurial存储库有子存储库(其中一些带有分支),以及大量合并和分支本身。我希望最终的git存储库保留所有这些历史,并且在签出存储库的早期部分或其他分支时是正确和完整的。我不需要新的存储库具有子模块或子树,尽管我也会接受使用它们的解决方案。我见过的一些方法将新repo顶部的所有子repo合并为分支,这意味着过去的签出并不包含子repo中的所有文件。我还尝试过将所有内容导入分支,将头部重置到过去,合并和向上重置基础,但是有太多的合并和许多冲突,即使使用- save -merges,所以我宁愿避免这种情况。我也找不到任何方法在git中将mercurial子存储库更新历史复制为子模块更新历史。有人有什么想法吗?谢谢你。
也许您可以做的一件事(但我不确定这是否有效)是使用hg-git将其推送到空的git存储库。
或者,您还可以扩展git-cinnabar以支持子repo转换为子模块。
遇到类似的问题(将带有子存储库的Mercurial项目移动到具有统一布局的Git),我打算采用两种方法:
- 在Mercurial中将子存储库转换为统一的项目布局—这里介绍:将多个子存储库合并为一个,并在Mercurial 中保留历史记录
- 现在你可以很容易地迁移到Git,我发现官方文档是最好的资源,有一个很好的说明如何清理提交历史(作者):https://git-scm.com/book/en/v2/Git-and-Other-Systems-Migrating-to-Git Mercurial
我正准备自己测试这个,并将根据结果更新这个答案…
免责声明:以下解决方案仅在您愿意将子库折叠到主库中时才有效,这可能是您所接受的,也可能是不接受的。
简而言之:将每个子repo转换为git,将主repo转换为git,然后让git合并这些repo。
-
设置快速导出。它需要Python 2.7和Mercurial 4.6.
-
每个subrepo:
- 使用快速导出转换
- 创建一个新目录来存放临时子仓库 初始化git:
git init; git config core.ignoreCase false;
- 使用所需的配置选项运行快速导出
- 使用快速导出转换
- 运行
git reset --hard HEAD
重新填充目录 - 根据需要从repo中删除hg的任何痕迹
- 配置文件夹以准备迁移1
- 在subrepo上提交更改
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