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 エンコードしていません。エラー メッセージis not a child of the destinationで Google 検索をいくつか試しましたが、回避策が見つかりませんでした。

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 応答の 2 番目の部分、つまりクライアント側と一致します。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 に答える