如何将带有分支的Git仓库转换为可用的Mercurial仓库?

3
我想将一个包含多个分支的Git仓库转换为Mercurial仓库。使用hg convert只会创建一个默认分支,然后该分支具有每个Git分支的head。
我已经阅读了如何使用hg convert将git分支导入mercurial?,并且知道在Git中无法确定哪个提交属于哪个分支。但是,对于我来说,具有与分支数量相同的head的存储库不是可行的解决方案。
由于所有分支都不同,因此显然不能将它们全部合并到一个单一的head上。
如何以这样或那样的方式转换或修改转换后的存储库,以便我在不同的分支上拥有每个head?请注意,我不一定需要将所有现有提交分配给正确的分支,而是希望从此时开始将提交分配给正确的分支,并且每个分支只有一个head。
1个回答

2

您必须了解有关Git的一些事情:

  • Git“分支”不是其他良好的VCS(如Mercurial)的分支,它们本质上是书签(“分支”仅标记头更改集,任何旧更改集都不包含此元数据)
  • 当Git用户谈论分支时,他在说谎,因为分支只在他的Git世界中是分支
  • 今天没有人会将Git“分支”转换为分支进行转换存储库
  • 在大多数情况下(除非是非常奇特的Git存储库),与其使用Convert Extension,使用hg-git会产生更正确(双向)的转换

特别为您重复了与您提供的问题相关的(通常很好的)VonC答案中的操作,并向您展示了一些图片(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之前,包括所有“分支”,从Mercurial的角度来看,导入的结果非常不同:存储库有一个真正的分支(命名为分支default)和其中的3个匿名分支,用Mercurial书签br1-br2-br3标记。
如果您想在此存储库中使用Mercurial命名分支,则必须手动创建命名分支并重写历史记录:
- 将新的空提交作为0的后代,它们将成为分支的起点 - 将匿名分支重新定位到这些新的父项(更改实际分支)
可选的最后一步是删除在步骤1中创建的空更改集(histedit 可做得很好)和所有无用的书签。

非常感谢,解释得非常好!历史重写是我在其他问题中缺失的部分。 - Chris
@Chris - 顺便说一下,你可以(理论上)自动化历史更改的所有部分,除了交互式设计的histedit。 - Lazy Badger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接