假设我们有一个trunk
和一个分支(COKE
)。 (我在SVN上运行Git并使用svn从trunk
合并到COKE
,而不是Git)
FILE1 on trunk
分支中的COKE
发生了变化。trunk
合并,我在COKE branch
上提交合并。FILE1
删除了trunk
,我希望在COKE
中进行更改。FILE1
上的COKE branch
发生了树冲突。由于(2)中的合并提交,是否会发生此树冲突?
我该怎么做才能解决这三个冲突?
svn resolve --accept theirs-full /path/FILE1
不起作用,只说“工作”才能奏效。
答案 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