将mercurial repo与子存储库迁移到git,保留历史记录的最佳方法?

时间:2015-05-28 02:08:07

标签: git mercurial migration git-submodules mercurial-subrepos

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

  1. 将您的子存储转换为Mercurial 中的统一项目布局 - 此处包含以下内容:Join multiple subrepos into one and preserve history in Mercurial
  2. 现在你可以轻松地迁移到Git了,我发现官方文档是最好的资源,并且有关于如何清理提交历史的好记录(作者): https://git-scm.com/book/en/v2/Git-and-Other-Systems-Migrating-to-Git#Mercurial
  3. 我正准备自己测试一下,并根据结果更新这个答案......

答案 2 :(得分:0)

免责声明:仅当您愿意将子存储库折叠到主存储库中时,以下解决方案才有效。


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

  1. 设置fast-export。它需要Python 2.7和Mercurial 4.6。

  2. 对于每个子仓库:

    1. 使用fast-export进行转换
      1. 创建一个新目录来存放您的临时子仓库
      2. 初始化git:elastic-beanstalk
      3. 根据需要使用配置选项运行快速导出
    2. 运行yaml重新填充目录
    3. 根据需要从存储库中删除所有汞痕迹
    4. 配置文件夹以准备迁移 1
    5. 在子仓库上提交更改。
  3. 使用步骤2.1-2.3将主仓库从hg转换为git。
  4. 根据需要将.hgignore文件转换为.gitignore
  5. 将更改提交到主仓库
  6. 使用this post
  7. 中的步骤合并每个子存储库
'About button.
Private Sub ButtonAbout_Click(sender As Object, e As RoutedEventArgs) Handles ButtonAbout.Click
    WindowAbout.ShowDialog()
End Sub

'Close button to close the main window.
Private Sub ButtonClose_Click(sender As Object, e As RoutedEventArgs) Handles ButtonClose.Click
    Close()
End Sub

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

git init; git config core.ignoreCase false;

转换后,新的仓库配置为:

git reset --hard HEAD

因此我们需要在子存储库中添加一个文件夹级别,以使它们类似于:

git remote add subrepo1 path/to/subrepo1
git fetch subrepo1 --tags
git merge subrepo1/master --allow-unrelated-histories
git remote remove subrepo1