【问题标题】:How can I convert a Git repository with branches to a workable Mercurial repository?如何将带有分支的 Git 存储库转换为可用的 Mercurial 存储库?
【发布时间】:2014-10-16 14:34:09
【问题描述】:

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

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

由于所有分支都不相同,我显然无法将它们全部合并到一个头中。

如何转换或修改转换后的存储库,以使每个负责人都在不同的分支上?请注意,我不一定需要将所有现有提交分配给正确的分支,但我希望从这一刻开始的提交分配给正确的分支,并且每个分支只有一个头。

【问题讨论】:

    标签: git mercurial branch dvcs mercurial-convert


    【解决方案1】:

    必须了解一些关于 Git 的知识:

    • Git“分支”不是任何其他 VCS 的分支,对于 Mercurial,它们本质上是书签(“分支”仅标记头部变更集,任何较旧的变更集都不包含此元数据)
    • 当 Git 男孩谈到分支时 - 他在撒谎,因为分支只是他的 Git 世界中的分支
    • Noboby(今天)将在转换存储库时将 Git-“分支”转换为分支
    • 在大多数情况下(除了非常奇特的 Git-repos)hg-git 而不是 Convert Extension 会产生更正确的(双向)转换

    我特别为你重复了(优秀的共同点)VonC answer 的操作,并会向你展示一些图片(来自 SmartGit 的 Git,来自 TortoiseHG 的 Mercurial)

    在所有提交之后,

    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 的 POV 中,导入的结果非常不同:存储库有一个 真正的分支(命名为分支 default)和 3 个匿名分支,其中标有 Mercurial 书签 br1-br2-br3。

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

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

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

    【讨论】:

    • 非常感谢,很好的解释!历史重写是我在另一个问题上遗漏的部分。
    • @Chris - 顺便说一句,您可以(理论上)自动化历史更改的所有部分,除了交互式设计 histedit
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    相关资源
    最近更新 更多