34

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

svn revert "build\myfile@test.meta"

SVN 跳过此文件并输出:

Skipped 'build\myfile'

我试着做:

svn revert "build\*.meta"

但它给出了相同的结果。

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

svn revert --recursive "build"

有解决方法吗?

4

4 回答 4

81

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

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

因此,您应该在脚本中的文件名上附加一个 @ 符号,如下所示:

svn revert "build\myfile@test.meta@"
于 2009-12-31T13:20:14.510 回答
22

只是为了添加到上述正确答案,如果您有很多名称中带有“@”符号的文件要批量处理(即使用 * 通配符),您可以在 OS X 终端中执行类似的操作(或任何Linux机器):

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

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

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

于 2010-08-18T11:31:49.197 回答
2

刚刚使用 cmd.exe shell 在 Windows 上对其进行了正确测试 - 将名称用双引号括起来:

ctmkx> svn revert "trunk\foo@bar.txt"
Reverted 'trunk\foo@bar.txt'
于 2009-12-31T12:44:15.567 回答
0

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

于 2009-12-31T12:20:00.930 回答