SVN合并 - 当分支没有共享共同祖先时,合并回主干

时间:2014-03-20 21:12:57

标签: svn version-control merge

我需要合并回一个分支branchA,该分支是svn mkdir而不是svn copy错误创建的。

使用svn merge --ignore-ancestry ^/branches/branchA .导致许多树冲突,我只能通过svn resolve --accept working来解决,尽管我需要的是接受来自branchA的更改。 我想这样做,因为branchAtrunk的超集,并且没有任何提交与branchA中的提交并行提交。

我有什么方法可以做到吗?

注意:
我无权运行svn-admin

1 个答案:

答案 0 :(得分:1)

简短的回答:你做不到。你不能,因为Subversion通常使用所谓的三向合并。您需要两个端点(分支的HEAD和主干的HEAD)以及最近的共同祖先(MRCA)作为合并中的第三个点。

MRCA用于确定分支上已更改的内容以及主干上已更改的内容。假设我们的文件最初看起来像这样:

one
two
three
four
five
six

在行李箱上我们有:

one
FOO
three
BAR
five
FUBAR

我们在分行上:

one
two
BARFOO
four
five
six

我们现在想要将我们的分支与主干合并。如果我们只是进行比较,我们会看到第2行,第4行和第6行不同。然而,在行李箱上改变了第二和第四行。我们不想更改它们以匹配分支上的内容。相反,分支上唯一更改的行是第3行。我们将第3行从分支替换为主干。没有其他线被触及。

现在,Subversion合并比这更复杂,但这是三向合并的基本算法:你比较你正在与他们的MRCA合并的两个HEAD。如果没有MRCA,您就无法合并 - 这就是您所处的情况。

即使--ignore-ancestory标记也不起作用,因为您的主干上有foo.txt,分支上有foo.txt。它们可能看起来像是同一个文件,但根据Subversion它们不是同一个文件。它们是两个完全不同的文件,恰好位于同一目录中并且具有相同的名称。

如果您想简单地强制您的主干看起来像您的分支,您可以尝试--accept theirs-full标志。同样,我不是100%确定这会起作用,因为Subversion可能会拒绝识别文件名。如果您没有安装Subversion 1.8,可以尝试--reintegrate选项。

最后,您可以尝试欺骗Subversion。从主干到正确的分支点建立另一个分支。看看那个新的分支。使用系统的复制命令(而不是通过Subversion)将文件从坏分支复制到此新分支。现在,提交任何更改(您可能必须添加不存在的文件并删除不应存在的文件)。承诺改变。

你应该有一个看起来与坏分支完全相同的新分支。但是,由于此分支具有MRCA,因此您应该能够进行合并。