从主干到分支的SVN合并导致树冲突

时间:2012-09-03 08:52:58

标签: svn merge svn-merge

假设我们有一个trunk和一个分支(COKE)。 (我在SVN上运行Git并使用svn从trunk合并到COKE,而不是Git)

  1. 我们想要FILE1 on trunk分支中的COKE发生了变化。
  2. 我们从trunk合并,我在COKE branch上提交合并。
  3. 然后从FILE1删除了trunk,我希望在COKE中进行更改。
  4. 我合并,FILE1上的COKE branch发生了树冲突。
  5. 由于(2)中的合并提交,是否会发生此树冲突?

    我该怎么做才能解决这三个冲突?

    svn resolve --accept theirs-full /path/FILE1不起作用,只说“工作”才能奏效。

2 个答案:

答案 0 :(得分:3)

除非缺少某些合并跟踪信息,否则此方案中不应存在树冲突。

要检查此项,请运行以下命令:

$ svn switch ^/branches/COKE
$ svn mergeinfo --show-revs=merged ^/trunk

这会将从trunk中合并的修订列表打印到COKE分支中。当您在主干上修改FILE1时,能否找到修订版?很可能没有那个修改。

这是一种常见的情况,当SVN用户将修改从一个分支合并到另一个分支,但是然后不提交整个工作副本(即包括根目录)而不是那些通过合并修改的文件。

<强>错误:

$ svn merge ^/trunk
--- Merging r5 through r6 into '.':
M    file.txt
--- Recording mergeinfo for merge of r5 through r6 into '.':
 U   .
$ svn commit FILE1

问题是根目录存储了svn:mergeinfo属性。 Subversion使用此属性来跟踪合并,因此您必须提交整个工作副本。

从右:

$ svn merge ^/trunk
--- Merging r5 through r6 into '.':
M    file.txt
--- Recording mergeinfo for merge of r5 through r6 into '.':
 U   .
$ svn commit .

当你第二次尝试将trunk合并到COKE分支时,Subversion检测到在中继处删除了FILE1,同时在COKE分支处修改了它(在步骤2中)。结果,它标记了文件与树冲突(本地编辑,合并时传入删除)。

如何解决?

现在您必须修复分支COKE的合并跟踪信息。为此,请使用--record-only选项和指定的正确修订重复步骤2:

$ svn merge --record-only -cN ^/trunk
--- Recording mergeinfo for merge of r5 through r6 into '.':
 U   .
$ svn commit .

其中N是主干中FILE1的修改,你试图合并。

答案 1 :(得分:1)

vadishev的回答让我知道创建这个脚本,它应该自动为你添加缺少的mergeinfo。

确保pwd是分支根,然后运行:

trun="path/to/trunk/root"
for i in `svn mergeinfo --show-revs=merged $trun | sed 's/^r//g'`
do 
  echo "working on $i"
  svn merge --record-only -c$i $trun
done

或者,作为oneliner:

trun="../../trunk/tetracosm"; for i in `svn mergeinfo --show-revs=merged $trun | sed 's/^r//g'`; do echo "working on $i"; svn merge --record-only -c$i $trun; done