场景:我有两个Mercurial存储库,我们称之为“Original”和“NewProduct”。
原版有1072年的修订历史。 NewProduct的创建如下:
从本质上讲,Original的当前状态用于创建没有Original的历史的新产品。
由于两种产品方向的意外变化,它们将比原先想象的更加相似。许多即将推出的更改将与这两种产品兼容。因此,能够在它们之间移植变更集是非常有用的。
问题:我想将NewProduct作为原始存储库中的命名分支。这有可能,我该怎么做呢?
尝试解决方案:
有关SO的问题看似相似,例如Mercurial merge repository as branch。我的场景中的主要区别在于,另一个存储库不是第一个存储库的克隆 - 它是基于第一个存储库的工作目录创建的。因此,解决方案似乎并不适用。
我第一次尝试解决这个问题就是使用补丁。
我认为如果NewProduct / r0中的文件与Original / r1072中的文件相同,那么从NewProduct / r1开始的任何更改集理论上都可以应用于Original / r1072之上。
所以这就是我所做的:
此过程在NewProduct中的第一个合并变更集处停止。我没有理解补丁与变更集不同 - 补丁只有一个父,而合并变更集有两个。
注意:我主要在TortoiseHg工作,所以如果可以使用GUI完成解决方案,那会更好,但命令行也可以接受。
答案 0 :(得分:0)
啊哈!通过使用ConvertExtension(https://www.mercurial-scm.org/wiki/ConvertExtension)和splicemap,branchmap和hg.startrev选项,我能够获得所需的结果。这个过程并不是很直观,所以这就是我所做的。
1)创建一个名为splicemap.txt的文件,其中包含两个完整的40位哈希:
splicemap.txt
first-revision-of-to-be-converted-history tip-of-existing-history
在我的场景中,first-revision-of-to-be-converted-history
是NewProduct / r1,因为r0被复制为工作目录。 tip-of-existing-history
是Original / r1077(打开指定分支NewProduct的空白提交)。
2)使用以下行创建名为branchmap.txt的文件:
branchmap.txt
default new_product_branch
这会导致默认分支中的NewProduct变更集导入到名为new_product_branch的原始存储库分支中。
3)执行以下命令:
hg --config hg.convert.hg.startrev=1 convert --splicemap splicemap.txt --branchmap branchmap.txt path/to/newproduct path/to/original
请注意额外选项--config convert.hg.startrev=1
。这是排除NewProduct / r0导入所必需的。
当我第一次运行没有该选项的命令时,NewProduct / r0被复制并成为一个没有父母或后代的悬空变更集。 splicemap选项不会阻止转换变更集,它只是定义哪个导入的变更集连接到现有历史记录。要从导入中排除早期更改集,还需要hg.startrev选项。