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

时间:2009-12-31 12:16:25

标签: file svn special-characters revert

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

svn revert "build\myfile@test.meta"

SVN会跳过此文件并输出:

Skipped 'build\myfile'

我尝试过:

svn revert "build\*.meta"

但它给出了相同的结果。

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

svn revert --recursive "build"

有解决方法吗?

4 个答案:

答案 0 :(得分:80)

Subversion中的@ sign in文件名实际上有一个特殊含义 - 一个挂钩的修订号。引用Subversion book

  

感知读者可能在这一点上想知道,peg修订版语法是否会导致工作副本路径或实际上有符号的URL出现问题。毕竟,svn如何知道news @ 11是否是我树中目录的名称,还是只是“新闻修订版11”的语法?值得庆幸的是,虽然svn将始终假设后者,但有一个简单的解决方法。您只需要在路径的末尾添加一个at符号,例如news @ 11 @。 svn只关心参数中的最后一个符号,并且在符号之后省略文字peg修订说明符并不被认为是非法的。此解决方法甚至适用于以at符号结尾的路径 - 您将使用filename @@来讨论名为filename @的文件。

因此,您应该在脚本中将@符号附加到文件名,如下所示:

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

答案 1 :(得分:22)

只是为了添加上面的正确答案,如果你想要批量处理的名称中有很多带有“@”符号的文件(即使用*通配符),你可以在OS中做这样的事情X终端(或任何Linux机箱):

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

上面的命令将使用find实用程序列出文件名中包含@的每个文件,然后使用XARGS将文件路径传递给SVN。 XARGS将用路径替换每次出现的%,并在文件名的末尾添加特殊的“@”,以便SVN接受它。

希望这会有所帮助 - 我不得不重新添加我的应用程序升级到iOS4.0所需的gazzilion @ 2x.png文件

答案 2 :(得分:2)

使用cmd.exe shell在Windows上正确测试 - 将名称括在双引号中:

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

答案 3 :(得分:0)

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