如何将带分支的Git存储库转换为可行的Mercurial存储库?

时间:2014-10-16 14:34:10

标签: git mercurial branch dvcs hg-convert

我想将具有多个分支的Git存储库转换为Mercurial存储库。使用hg convert只创建一个默认分支,然后为每个Git分支创建一个头。

我已经阅读How are git branches imported into mercurial with hg convert?并且我知道无法知道哪个提交属于Git中的哪个分支。但是,对于我来说,拥有尽可能多的分支的存储库对我来说不是一个可行的解决方案。

由于所有分支都不同,我显然不能将它们全部合并到一个单独的头部。

如何以这样一种方式转换或修改转换后的存储库?请注意,我不一定需要将所有现有提交分配给正确的分支,但我希望从此时开始的提交被分配到正确的分支,并且每个分支只有一个头。

1 个答案:

答案 0 :(得分:2)

必须才能了解一些关于Git的事情:

  • Git"分支"不是任何其他好的 VCS的分支,对于Mercurial而言,他们本质上是书签("分支"仅标记head-changeset,任何旧的变更集都不包含此元数据)
  • 当Git-boy谈论分支时 - 他说谎,因为分支只是在他的Git世界中分支
  • Noboby(今天)将转换Git - "分支机构"进入转换存储库的分支机构
  • 在大多数情况下(非常奇特的Git-repos除外)hg-git而不是转换扩展将产生更正确的(双向)转换

特别为您重复操作(优秀的共同点)VonC answer并链接您的问题并向您展示一些照片(Git'来自SmartGit,Mercurial来自TortoiseHG)

毕竟提交后,

GitRepo>git log --oneline
79ea101 third evolution in branch 2
720ac25 second evolution in branch 2
48951c3 first evolution in branch 2
6cf26b0 first content, to be evolved in three different branches

导入Mercurial之前,所有"分支"

Git-repo

从Mercurial的POV中,导入的结果非常不同:存储库有一个真实分支(名为branch default)和3个匿名分支,标有 Mercurial书签 br1-br2-br3。

HG-repo

如果要在此存储库中使用Mercurial命名分支,则必须手动创建命名分支并重写历史记录:

  • 提交新的空更改集作为0的后代,它们将是分支的起点
  • 将匿名分支重新分配给这些新父母(更改实际分支)

Rebased HG-repo

作为可选项,您可以删除在步骤1中创建的最后一步空更改集(histedit做得好)和所有无用的书签

Clean HG-repo