Mercurial:将另一个存储库导入为新分支

时间:2018-02-21 11:48:25

标签: mercurial branching-and-merging

场景:我有两个Mercurial存储库,我们称之为“Original”和“NewProduct”。

原版有1072年的修订历史。 NewProduct的创建如下:

  1. 将原件更新为提示(r1072)
  2. 将工作目录复制到新文件夹
  3. 在该文件夹中创建存储库NewProduct
  4. 添加所有文件并对NewProduct执行初始提交
  5. 从本质上讲,Original的当前状态用于创建没有Original的历史的新产品。

    由于两种产品方向的意外变化,它们将比原先想象的更加相似。许多即将推出的更改将与这两种产品兼容。因此,能够在它们之间移植变更集是非常有用的。

    问题:我想将NewProduct作为原始存储库中的命名分支。这有可能,我该怎么做呢?

    尝试解决方案

    有关SO的问题看似相似,例如Mercurial merge repository as branch。我的场景中的主要区别在于,另一个存储库不是第一个存储库的克隆 - 它是基于第一个存储库的工作目录创建的。因此,解决方案似乎并不适用。

    我第一次尝试解决这个问题就是使用补丁。

    我认为如果NewProduct / r0中的文件与Original / r1072中的文件相同,那么从NewProduct / r1开始的任何更改集理论上都可以应用于Original / r1072之上。

    所以这就是我所做的:

    1. 导出NewProduct的修订版1..tip as patches
    2. 在原始
    3. 中创建新的命名分支
    4. 导入补丁
    5. 此过程在NewProduct中的第一个合并变更集处停止。我没有理解补丁与变更集不同 - 补丁只有一个父,而合并变更集有两个。

      注意:我主要在TortoiseHg工作,所以如果可以使用GUI完成解决方案,那会更好,但命令行也可以接受。

1 个答案:

答案 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选项。