【发布时间】:2010-08-25 11:31:41
【问题描述】:
我可能发现了一个 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),我不知道如何解决(合并应该已经克服了这个问题)。所以唯一的方法(我认为)是为分支签出一个新的工作副本。
那么,有没有比我做的更好的解决方案?我应该提交错误吗?
谢谢, 丹尼尔
【问题讨论】: