6

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

4

3 回答 3

1

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

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

于 2015-05-28T11:05:03.397 回答
1

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

  1. 将您的子存储库转换为Mercurial 中的统一项目布局- 此处介绍:将多个子存储库合并为一个并保留 Mercurial 中的历史记录
  2. 现在您可以轻松迁移到 Git,我发现官方文档是最好的资源,并附有关于如何清理提交历史的很好说明(作者): https ://git-scm.com/book/en/v2/Git-和其他系统迁移到 Git#Mercurial

我正要自己测试这个,并会根据结果更新这个答案......

于 2015-08-04T09:10:48.473 回答
0

免责声明:仅当您愿意将子存储库折叠到主存储库中时,以下解决方案才有效,这可能会或可能不会被您接受。


简而言之:将每个子存储库转换为 git,将主存储库转换为 git,并让 git 合并存储库。

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

  2. 对于每个子仓库:

    1. 使用快速导出进行转换
      1. 创建一个新目录来存放您的临时子存储库
      2. 初始化 git:git init; git config core.ignoreCase false;
      3. 根据需要使用配置选项运行快速导出
    2. 运行git reset --hard HEAD以重新填充目录
    3. 根据需要从 repo 中删除任何 hg 痕迹
    4. 配置文件夹以准备迁移1
    5. 在 subrepo 上提交更改。
  3. 使用步骤 2.1-2.3 将主存储库从 hg 转换为 git。
  4. 根据需要将 .hgignore 文件转换为 .gitignore
  5. 将更改提交到主仓库
  6. 使用本文中的步骤合并每个子存储库
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 回答