SVN合并错误,合并主干到分支和链接已被目录替换

时间:2010-08-25 11:31:42

标签: svn merge

我可能发现了一个Subversion错误,我想在报告之前确定它是这样。

考虑以下一系列行动:

使用/ trunk和/ branches创建一个新的SVN存储库:

~$ svnadmin create testrepo
~$ svn co file:///home/user/testrepo testwd
Checked out revision 0.
~$ cd testwd/
testwd$ svn mkdir trunk branches
A         trunk
A         branches
testwd$ svn commit
Adding         branches
Adding         trunk

Committed revision 1.
testwd$ cd ..

查看主干的工作目录:

~$ svn co file:///home/user/testrepo/trunk testtrunkwd
Checked out revision 1.
~$ cd testtrunkwd/

创建一个新的符号链接并提交它(假设存在/home/user/test):

testtrunkwd$ ln -s /home/user/test x
testtrunkwd$ svn add x
A         x
testtrunkwd$ svn commit
Adding         x
Transmitting file data .
Committed revision 2.

创建一个名为mybranch的分支:

testtrunkwd$ svn copy ^/trunk ^/branches/mybranch

Committed revision 3.

删除此新链接,提交,更新,创建具有相同名称的目录,提交:

testtrunkwd$ svn rm x
D         x
testtrunkwd$ svn commit
Deleting       x

Committed revision 4.
testtrunkwd$ svn update
At revision 4.
testtrunkwd$ svn mkdir x
A         x
testtrunkwd$ svn commit
Adding         x

Committed revision 5.
testtrunkwd$ cd ..

查看分支的工作目录:

~$ svn co file:///home/user/testrepo/branches/mybranch testbranchwd
A    testbranchwd/x
Checked out revision 5.
~$ cd testbranchwd/

将来自主干的更改合并到分支中:

testbranchwd$ svn merge ^/trunk
svn: Can't replace 'x' with a node of a differing type; the deletion must be committed and the parent updated before adding 'x'

我的问题是我是否做错了,或者这确实是一个Subversion错误。


我发现这个问题的(坏)解决方案是进行两部分合并:
创建分支的新工作副本:

testbranchwd$ cd ..
~$ svn co file:///home/user/testrepo/branches/mybranch testbranchwd2
A    testbranchwd2/x
Checked out revision 5.
~$ cd testbranchwd2

合并从中继线到删除链接x的点的更改:

testbranchwd2$ svn merge -r3:4 ^/trunk
--- Merging r4 into '.':
D    x

提交合并并更新分支的工作副本(没有任何这些步骤,我在尝试合并时再次从上面收到错误消息):

testbranchwd2$ svn commit
Sending        .
Deleting       x

Committed revision 6.
testbranchwd2$ svn update 
At revision 6.
testbranchwd2$ svn merge ^/trunk
--- Merging r5 through r6 into '.':
A    x

此合并成功。


虽然这个解决方案有效,但它有几个缺点:

  • 我花了两天时间才提出这个问题:错误信息具有误导性,并且根本不清楚应该做什么。
  • 必须在删除链接之前为每个创建的分支(或最后一个从主干合并到分支)完成,如果有很多链接,这将是很麻烦。
  • merge似乎不是正确的行为。如果链接被中继中的目录替换,为什么分支会关心?分支只是希望将所有更改合并到其中,这意味着当分支中没有对相关文件进行任何更改时,结果应该与主干相同。
  • 如果在分支的第一个工作目录中尝试此解决方案(在错误合并之后),则它不起作用。 svn revert没有帮助,因为这种部分合并使工作副本处于某种不一致的状态:
    如果在分支的第一个工作副本中完成svn status,则结果为:

    testbranchwd$ svn status
    ~ x
    这个~表示versioned item obstructed by some item of a different kind(根据svn help status),我不知道如何解决(合并应该克服这一点)。所以唯一的方法(我认为)是检查分支机构的新工作副本。


那么,有没有比我做的更好的解决方案?我应该提交错误吗?

谢谢, 丹尼尔

1 个答案:

答案 0 :(得分:0)

好吧,显然我应该删除x,将删除提交到分支,更新然后正常运行合并。

我被告知将在Subversion 1.7中完全重写工作副本处理代码。