2

如果我从 svn 存储库中检查一个目录,并且存储库内的路径包含括号,当我尝试重新检查工作目录时,我会收到一条 svn 'Commit failed' 消息。

我知道在路径名中使用括号不是一个好习惯;我只是想收拾别人的烂摊子。

这是检查此类存储库的示例:

$ svn co http://cvs.xyzzy.com/svn/ie/Userhome/bchittenden/Test%20%28With%20Stupid%20Parentheses%29/
A    Test (With Stupid Parentheses)/foo
A    Test (With Stupid Parentheses)/bar
A    Test (With Stupid Parentheses)/baz
Checked out revision 61793.

当我尝试提交时,我收到以下消息:

$ svn ci
Adding         branches
Adding         tags
Adding         trunk
svn: Commit failed (details follow):
svn: A MERGE response for '/svn/ie/Userhome/bchittenden/Test%20(With%20Stupid%20Parentheses)/tags' is not a child of the destination ('/svn/ie/Userhome/bchittenden/Test%20%28With%20Stupid%20Parentheses%29')
svn: Your commit message was left in a temporary file:
svn:    '/tmp/Test (With Stupid Parentheses)/svn-commit.tmp'

请注意,更改确实会签入存储库,我可以签出存储库的新版本并在那里工作,但是当我尝试签入时会收到相同的消息。

如果我对此的解释正确,那么当 SVN 服务器尝试验证正在提交的文件的名称时,它没有正确地 URL 编码路径名中的 '(' 和 ')' 字符。我在错误消息上尝试了几次 Google 搜索is not a child of the destination,但找不到解决方法。

4

1 回答 1

0

当我svn info | grep URL检查它时在工作目录上运行时,我得到

$ svn info | grep URL
URL: http://cvs.xyzzy.com/svn/ie/Userhome/bchittenden/Test%20%28With%20Stupid%20Parentheses%29

这匹配SVN MERGE 响应的第二部分,即客户端。事实证明,我可以使用svn switch更改 URL 来解决冲突:

$ svn switch 'http://cvs.xyzzy.com/svn/ie/Userhome/bchittenden/Test%20(With%20Stupid%20Parentheses)'
E    trunk
E    branches
E    tags
Updated to revision 61900.

现在 URL 匹配 SVN MERGE 响应的第一部分(即服务器端),并且没有冲突。

$ svn info | grep URL
URL: http://cvs.xyzzy.com/svn/ie/Userhome/bchittenden/Test%20(With%20Stupid%20Parentheses)

在此之后,如果我更改文件“bar”并将其签入,则更改将正确提交:

$ svn ci -m 'changed bar'
Sending        bar
Transmitting file data .
Committed revision 61901.
于 2012-12-10T20:44:56.140 回答