我正在尝试将 mercurial 存储库迁移到 git,但问题是 mercurial 存储库具有子存储库(有些带有分支),并且本身有很多合并和分支。我希望最终的 git 存储库保留所有这些历史记录,并且在检出存储库或其他分支的早期部分时是正确和完整的。我不需要新的存储库有子模块或子树,尽管我也接受使用它的解决方案。我见过的一些方法将新存储库顶部的所有子存储库合并为分支,这意味着过去签出不包含子存储库中的所有文件。我也尝试过将所有内容作为分支导入,将头部重置为过去,合并和向上变基,但是合并太多并且出现了很多冲突,即使使用--preserve-merges,所以我宁愿避免这种情况。我也找不到任何方法将 git 中的 mercurial 子存储库更新历史记录复制为子模块更新历史记录。有没有人有任何想法?谢谢你。
问问题
1747 次
3 回答
1
也许您可以做的一件事(但我不确定这是否可行)是使用 hg-git 推送到一个空的 git 存储库。
或者,您也可以扩展git-cinnabar以支持将 subrepo 转换为子模块。
于 2015-05-28T11:05:03.397 回答
1
有类似的问题(将带有子存储库的 Mercurial 项目移动到具有统一布局的 Git)我打算采用 2 折方法:
- 将您的子存储库转换为Mercurial 中的统一项目布局- 此处介绍:将多个子存储库合并为一个并保留 Mercurial 中的历史记录
- 现在您可以轻松迁移到 Git,我发现官方文档是最好的资源,并附有关于如何清理提交历史的很好说明(作者): https ://git-scm.com/book/en/v2/Git-和其他系统迁移到 Git#Mercurial
我正要自己测试这个,并会根据结果更新这个答案......
于 2015-08-04T09:10:48.473 回答
0
免责声明:仅当您愿意将子存储库折叠到主存储库中时,以下解决方案才有效,这可能会或可能不会被您接受。
简而言之:将每个子存储库转换为 git,将主存储库转换为 git,并让 git 合并存储库。
设置快速导出。它需要 Python 2.7 和 Mercurial 4.6。
对于每个子仓库:
- 使用快速导出进行转换
- 创建一个新目录来存放您的临时子存储库
- 初始化 git:
git init; git config core.ignoreCase false;
- 根据需要使用配置选项运行快速导出
- 运行
git reset --hard HEAD
以重新填充目录 - 根据需要从 repo 中删除任何 hg 痕迹
- 配置文件夹以准备迁移1
- 在 subrepo 上提交更改。
- 使用快速导出进行转换
- 使用步骤 2.1-2.3 将主存储库从 hg 转换为 git。
- 根据需要将 .hgignore 文件转换为 .gitignore
- 将更改提交到主仓库
- 使用本文中的步骤合并每个子存储库
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
所以我们需要向子存储库添加一个文件夹级别,以便它们像:
SubRepo1 (master)
L SubRepo1
L SubRepo1-Data
于 2019-02-12T00:42:17.647 回答