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

34
当我尝试执行像这样的命令(无论是从命令行还是Perl脚本):
svn revert "build\myfile@test.meta"

SVN跳过了这个文件并输出:

Skipped 'build\myfile'

我尝试进行:

svn revert "build\*.meta"

但是它会给出相同的结果。

我可以从GUI中还原这些文件。 我也可以通过执行以下操作还原这些文件(但是它还原的内容比我想要的多):

svn revert --recursive "build"

有没有解决此问题的方法?

4个回答

82
在Subversion中,文件名中的@符号实际上具有特殊含义-被钉住的修订版本号。援引Subversion文档的说法:
“敏锐的读者可能会想知道,如果工作副本路径或URL实际上包含@符号,钉住修订版语法是否会导致问题。毕竟,如何确定news@11是树中一个目录的名称,还是“新闻”的第11个修订版本的语法?幸运的是,尽管svn始终假定后者,但这有一个微不足道的解决方法。您只需要在路径末尾添加一个@符号,例如news@11 @。svn只关心参数中最后一个at符号,省略该字面钉住修订版本说明符并不违规。这种解决方法甚至适用于以@符号结尾的路径-您可以使用filename@@来讨论名为filename@的文件。”
因此,在脚本中,您应该在文件名末尾附加@符号,例如:
svn revert "build\myfile@test.meta@"

使用bhavinb的脚本来在目录中的每个文件上执行此操作。很棒的脚本,也很好的回答Avi。 - Evan Moran
谢谢!我都快疯了。 - Evert
这是 iPhone 编程中的一个问题,因为图像的标准命名约定是 myimage@2x.png,但这个解决方法非常有效。谢谢! - Adam Pierce

22

补充以上正确答案,如果你有很多文件名中带有“@”符号并希望批量处理(即使用*通配符),可以在OS X终端(或任何Linux系统)中执行以下操作:

find . -name "*@*" | xargs -I % svn add %@
上述命令将使用find工具列出文件名中带有@的每个文件,然后通过管道将文件路径传递给SVN。XARGS将替换每个%出现的位置,并在文件名末尾附加特殊的“@”,以便SVN接受它。
希望这可以帮助您——为了使我的应用程序升级到iOS4.0需要添加大量@2x.png文件,我不得不苦思冥想一段时间。

这真是救命稻草。我实际上将它与 svn stat | grep "^?" | awk '{print $2}' | xargs svn add 结合起来,以执行 svn stat | grep "^?" | awk '{print $2}' | xargs -I % svn add %@。 - Arunabh Das

2

我在Windows系统上使用cmd.exe测试了一下,使用双引号将名称括起来是有效的:

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

0

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


这是Windows系统。单引号不起作用 - 您会得到这样的输出: 跳过''build''(即双单引号) - Paulius Liekis
1
@Paulius:在你最初的问题中提供操作系统信息会很有用。 - Ken White
此外,在nix上,单引号技巧对此无效。 - Purrell
@Purrell,好的注意到了,我之前认为在解析命令行时有问题。 - hometoast

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接