在Mercurial中重新定位:如何将两个独立的svn克隆重新组合在一起?

mat*_*ets 6 mercurial rebase reparenting

情况就是这样:开发人员Foo从我们的svn repo创建了一个hg repo.Foo的hg repo只是svn中主干的浅层克隆(没有svn分支,标签等,历史不完整[约100个变更集]).Developer Bar做了同样的事情,但克隆了整个svn repo,包括整个历史,分支,标签等.Foo和Bar都在他们的存储库上进行了分支开发.

两个存储库都有一个共同的SVN祖先,但每个hg repo都有不同的版本号.我想重温Foo从共同祖先到Bar's repo的变化.这是我正在寻找的图表:

Foo的回购:

C'-D'-E-F---G
       \   /
        H-I
Run Code Online (Sandbox Code Playgroud)

Bar的回购:

...A-B-C-D-J-K---L
            \   /
             M-N
Run Code Online (Sandbox Code Playgroud)

C,C'和D,D'具有相同的内容,但版本号和注释不同.

目标:

...A-B-C-D--E-F---G
          \  \   /
           \  H-I
            \
             J-K---L
              \   /
               M-N
Run Code Online (Sandbox Code Playgroud)

我已经没有关于如何实现这一目标的想法.我试过转换--splicemap splice.map [splice.map文件包含ED](没有做任何事情).克隆-f设法将所有内容整合到一个仓库中,但它们似乎是独立的树.克隆-f后,我尝试了rebase --source E --dest D --detach,但它只是崩溃了:(

想法?

我知道更改历史记录将使任何人对存储库的克隆无效,在这种情况下这不是问题.所有用户都将从这项工作的结果中重新克隆.

mat*_*ets 2

解决了!

我最初没有注意到的一件事是,我假定的共同祖先毕竟并不完全相同。在 Foo 的存储库的 svn->hg 转换期间,$ID$ 字符串被扩展,但在创建 Bar 的存储库时并未扩展。下面的步骤 1 是创建真正的共同祖先的简单修复。

以下步骤让我实现了我的目标:

1-确保假定的共同祖先(D 和 D')实际上是相同的。如果没有,请在 Bar 的存储库中为它们创建一个新的拼接点 (S)。在我的示例中,S 应该与 D' 的内容完全匹配。

    ...ABCD--JK---L
              \ \ /
               神经网络

2-修剪 Foo 的存储库的历史记录以删除重复的历史记录,包括 D',使用

    hg 转换 --splicemap TrimSplicemap Foo FooTrimmed

TrimSplicemap 内容:(其中 E 是 E 的完整哈希值)

    E 0000000000000000000000000000000000000000

3-使用 hg strip 删除断开连接的冗余历史记录

    cd Foo修剪
    汞条C'

4-再次使用 hg Convert 将 Foo 的剥离存储库拼接到 Bar 的提交“S”的存储库上

    cd ../酒吧
    hg 转换 --splicemap FooBarSplicemap ../FooTrimmed 。

FooBarSplicemap 内容:(其中 E' 是 FooTrimmed 中 E 的新哈希值,S 是 S 的哈希值)

    E'S

应该这样做!:D