5

假设我们有一个trunk和一个分支 ( COKE)。(我在 SVN 上运行 Git 并与 svn 合并,trunkCOKE不是 Git)

  1. FILE1 on trunk我们希望在COKE分支中发生了变化。
  2. 我们从合并trunk,我在COKE branch.
  3. 然后FILE1从 中删除trunk,我要在 中更改COKE
  4. FILE1我合并并在 on上发生树冲突COKE branch

是否由于 (2) 中的合并提交而发生此树冲突?

我能做些什么来解决这三个冲突?

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

4

2 回答 2

3

在这种情况下应该没有树冲突,除非缺少某些合并跟踪信息。

为了检查这一点,请运行以下命令:

$ svn switch ^/branches/COKE
$ svn mergeinfo --show-revs=merged ^/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 .

当你第二次尝试将主干合并到 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 的修改。

于 2012-10-16T16:44:13.113 回答
1

vadishev 的回答为我提供了创建此脚本的知识,该脚本应自动为您添加缺少的合并信息。

确保 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
于 2015-08-12T00:16:08.513 回答