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

Pau*_*kis 34 svn file revert special-characters

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

svn revert "build\myfile@test.meta"
Run Code Online (Sandbox Code Playgroud)

SVN跳过此文件并输出:

Skipped 'build\myfile'
Run Code Online (Sandbox Code Playgroud)

我试过做:

svn revert "build\*.meta"
Run Code Online (Sandbox Code Playgroud)

但它给出了相同的结果.

我可以从GUI恢复这些文件.我可以通过执行来恢复这些文件(但它恢复的次数超出了我的要求):

svn revert --recursive "build"
Run Code Online (Sandbox Code Playgroud)

这有解决方法吗?

Avi*_*Avi 80

Subversion中的@ sign in文件名实际上具有特殊含义 - 一个挂钩的修订号.引用Subversion书籍:

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

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

svn revert "build\myfile@test.meta@"
Run Code Online (Sandbox Code Playgroud)


bha*_*inb 22

只是为了添加上面的正确答案,如果你想在批处理中使用名称中带有"@"符号的大量文件(即使用*通配符),你可以在OS X终端中执行类似的操作(或任何Linux机箱真的):

find . -name "*@*" | xargs -I % svn add %@
Run Code Online (Sandbox Code Playgroud)

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

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