为什么Subversion跳过包含@符号的文件?

当我尝试像这样执行命令时(从命令行或Perl脚本 – 没关系):

svn revert "build\myfile@test.meta" 

SVN跳过这个文件并输出:

 Skipped 'build\myfile' 

我试过了:

 svn revert "build\*.meta" 

但它给出了相同的结果。

我可以从GUI恢复这些文件。 我可以通过这样做来恢复这些文件(但它比我想要的还要多):

 svn revert --recursive "build" 

有没有解决方法?

Subversion中的@符号文件名实际上有一个特殊的含义 – 一个固定的修订号。 引用Subversion书 :

感知型读者可能想知道在这一点上,peg修订版本语法是否会导致工作副本path或实际上具有标志的URL。 毕竟,svn怎么知道news @ 11是否是我树中某个目录的名字,或者只是“新闻修订版11”的语法? 值得庆幸的是,虽然svn将总是假设后者,但是有一个简单的解决方法。 你只需要在path的末尾附加一个at符号,比如news @ 11 @。 svn只关心参数中的最后一个符号,在符号之后忽略字面peg修订说明符并不认为是非法的。 此解决方法甚至适用于以符号结尾的path – 您将使用filename @@来讨论名为filename @的文件。

所以,你应该在脚本中追加一个@符号作为文件名,如下所示:

 svn revert "build\myfile@test.meta@" 

只需要添加上面的正确答案,如果你有很多文件的名字中带有“@”符号,你想要批量处理(即使用*通配符),你可以在OS X Terminal(或任何Linux的盒子):

 find . -name "*@*" | xargs -I % svn add %@ 

上面的命令将使用find实用程序在文件名中用@标出每个文件,然后使用XARGS将文件的path传送到SVN。 XARGS将用pathreplace每个出现的%,并在文件名末尾附加特殊的“@”,以便SVN接受它。

希望这会有所帮助 – 我不得不敲我的头,添加我的应用程序需要升级iOS4.0所需的gazzilion @ 2x.png文件

刚刚在Windows上使用cmd.exe shell进行了正确的testing – 将名称用双引号括起来:

 ctmkx> svn revert "trunk\foo@bar.txt" Reverted 'trunk\foo@bar.txt' 

什么操作系统? 如果它是* nix系统,请尝试用'single @ quotes'引用您的文件。