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,但它只是崩溃了:(
想法?
我知道更改历史记录将使任何人对存储库的克隆无效,在这种情况下这不是问题.所有用户都将从这项工作的结果中重新克隆.
解决了!
我最初没有注意到的一件事是,我假定的共同祖先毕竟并不完全相同。在 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
| 归档时间: |
|
| 查看次数: |
1377 次 |
| 最近记录: |