【问题标题】:SVN Merge error, merging trunk to branch and link has been replaced with directorySVN合并错误,将主干合并到分支和链接已替换为目录
【发布时间】: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),我不知道如何解决(合并应该已经克服了这个问题)。所以唯一的方法(我认为)是为分支签出一个新的工作副本。


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

谢谢, 丹尼尔

【问题讨论】:

    标签: svn merge


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      相关资源
      最近更新 更多