假设我们有一个主干
和一个分支(COKE
)。 (我通过 SVN 运行 Git,并使用 svn 从 trunk
合并到 COKE
,而不是 Git)
主干上的 FILE1
发生了我们希望在COKE
分支中发生的更改。- 我们从
主干
合并,我在COKE分支
上提交合并。 - 然后从
trunk
中删除FILE1
,我希望在COKE
中进行更改。 - 我进行合并,
COKE 分支
上的FILE1
发生树冲突。
这个树冲突是否是因为(2)中的合并提交而发生的?
我该如何解决这三个冲突?
svn resolve --accept Theirs-full/path/FILE1
不起作用,表示只有“工作”才能工作。
最佳答案
除非缺少某些合并跟踪信息,否则在这种情况下不应出现树冲突。
为了检查这一点,请运行以下命令:
$ svn switch ^/branches/COKE
$ svn mergeinfo --show-revs=merged ^/trunk
这会打印从主干合并到 COKE 分支的修订列表。当你修改了trunk中的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 在 trunk 处被删除,同时它在 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 的修改。
关于SVN从主干合并到分支会导致树冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12244698/