2015-02-06 79 views
0

我遇到一个最初是CVS存储库的Mercurial存储库。它最近已经用cvs2hg迁移到Mercurial。有没有办法在与Mercurial合并时设置自定义基础版本?

CVS存储库有几个分支,让我们打电话给他们两个“主要”和“功能”。 “功能”在很长一段时间以前一直是“主”的分支。在分支之间,变化通常通过检查一个分支中提交的变化而被“合并”。经常有标签的“合并”修订,其中“主要”和“功能”相同。

当我尝试在Mercurial中进行第一个(实际)合并时,三向合并假定“基本”版本是“特征”最初分支时的修订。这意味着有很多具有冲突的视觉集群,其中“主要”和“特征”几乎相互等同,但与“基础”版本非常不同。这非常糟糕,合并需要很长时间,并且容易出错。

我想知道是否有办法告诉Mercurial基础版本是标记的“合并”修订版之一,例如,

hg up功能; hg merge main --base“tag-xyz”

在这种情况下,合并很容易。

回答

1

我会建议修复你最近的历史。这有点混乱,但一旦完成,Mercurial的合并应该可以正常工作。

首先,找到最近的特征和主要分支完全相同的点。合并等效提交(合并主要功能)。这应该创造一个新的头与两个父母(一个来自功能,一个来自主)。此外,该头应该位于特征分支上,而不是主分支上。由于提交完全相同,所以不应该遇到冲突。接下来,您需要将该功能分支的其余部分重新绑定到此头上。

假设新的头是承诺abc。再次,这个头部有两个父母,其中一个在特征分支上。该功能父母有第二个孩子,这也在功能分支上。假设第二个孩子是提交def。然后,你可以按照如下步骤进行底垫:

hg phase -f -d 'def::' # Unnecessary if you've never pushed 
hg rebase -s def -d abc 

这将改变提交的数字def及其所有后代。如果您有多个存储库实例,则需要进行相同的修复,否则您需要重新克隆它们。否则,当人们推拉时,您的存储库会变得非常混乱。

一旦你完成了这一点,合并应该“只是工作。”

+0

谢谢凯文! – 2015-02-10 09:04:00

相关问题