SVN从主干合并到分支会导致树冲突
假设我们有一个SVN从主干合并到分支会导致树冲突,svn,merge,svn-merge,Svn,Merge,Svn Merge,假设我们有一个主干和一个分支(可口可乐)。(我在SVN上运行Git,并从trunk合并到COKE与SVN,而不是Git) 主干上的FILE1发生了更改,我们希望在COKE分支中进行更改 我们从trunk合并,我在COKE branch提交合并 然后将FILE1从trunk中删除,我希望在COKE中进行更改 我合并,在可口可乐分公司的文件1上发生树冲突 此树冲突是否是由于(2)中的提交与合并导致的? 我能做些什么来解决这三个冲突? svn resolve——接受他们的完整/path/FILE1不起
主干
和一个分支(可口可乐
)。(我在SVN上运行Git,并从trunk
合并到COKE
与SVN,而不是Git)
FILE1发生了更改,我们希望在COKE
分支中进行更改
trunk
合并,我在COKE branch
提交合并FILE1
从trunk
中删除,我希望在COKE
中进行更改文件1
上发生树冲突svn resolve——接受他们的完整/path/FILE1
不起作用,表示只有“工作”起作用。除非缺少某些合并跟踪信息,否则在此场景中不应存在树冲突
要检查此情况,请运行以下命令:
$ svn switch ^/branches/COKE
$ svn mergeinfo --show-revs=merged ^/trunk
这将打印从主干合并到可口可乐分支的修订列表。当您在主干上修改文件1时,是否可以找到修订版?很可能没有那个修订
当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 merge ^/trunk
--- Merging r5 through r6 into '.':
M file.txt
--- Recording mergeinfo for merge of r5 through r6 into '.':
U .
$ svn commit .
问题是根目录存储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 FILE1
$ svn merge ^/trunk
--- Merging r5 through r6 into '.':
M file.txt
--- Recording mergeinfo for merge of r5 through r6 into '.':
U .
$ svn commit .
当您第二次尝试将主干合并到COKE分支时,Subversion检测到FILE1在主干处被删除,同时它在COKE分支处被修改(步骤2)。结果,它将文件标记为树冲突(本地编辑、合并时传入删除)
如何解决这个问题?
现在,您必须修复分支的合并跟踪信息。为此,请使用--record only选项和指定的正确版本重复步骤2:
$ svn merge --record-only -cN ^/trunk
--- Recording mergeinfo for merge of r5 through r6 into '.':
U .
$ svn commit .
其中N是您试图合并的主干中对文件1的修改。瓦迪舍夫的回答让我知道如何创建此脚本,它会自动为您添加缺少的合并信息 确保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
或者,作为一个单行线:
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
这是一个很好的答案,非常有启发性!谢谢你的信息!