如何在 Subversion 托管文件名中转义@字符?

对于许多 Subversion 操作,将“@”符号追加到文件或 URL 参数的末尾允许您针对该文件的特定修订。例如,“ svn info test.txt@1234”将提供有关 test.txt 的信息,就像它在修订版1234中存在的那样。

但是,当文件名包含一个@时,Subversion 将其错误地解释为修订说明符:

Svn info‘ test@. txt’< p > svn info‘ test@. txt’ Svn: 语法错误解析修订’. txt’

我试过双引号和单引号,也试过用“/”、“”和“@”转义。如何告诉 Subversion 将@符号作为文件名的一部分?

54217 次浏览

摘自 SVN 的书(强调后加) :

敏锐的读者此时可能想知道,peg 修订语法是否会对工作拷贝路径或实际上有符号的 URL 造成问题。毕竟,Svn如何知道 news@11是我树中目录的名称,还是仅仅是“ 新闻版本11”的语法?值得庆幸的是,虽然 Svn总是采用后者,但有一个微不足道的解决方案。您只需要在路径的末尾附加一个 at 符号,例如 news@11@Svn只关心参数中的最后一个 at 符号,并且在这个 at 符号之后省略一个文本 peg 修订说明符并不被认为是非法的。这种变通方法甚至适用于以 at 符号结尾的路径ーー您可以使用 filename@@来讨论名为 文件名@的文件。

添加以下文件: image@2x.png 执行以下操作: Svn add image@2x. png@

最初的答案是正确的,但可能不够明确:

svn info 'image@2x.png@'

或者

svn info "image@2x.png@"

或者

svn info image\@2x.png\@

我刚测试了三个。

@ David H

我刚刚尝试了一个类似的命令,但没有转义@符号,它仍然可以正常工作

svn ci splash.png splash@2x.png@

这是在 GNU bash 3.2.48(1)-release (x86 _ 64-apple-darwin10.0)和 svn 1.6.16上完成的

在我的例子中,我需要从包含@符号的 SVN 回购中删除文件:

这行不通:

svn remove 'src/assets/images/hi_res/locales-usa@2x.png'

但这个确实做到了:

svn remove 'src/assets/images/hi_res/locales-usa@2x.png@'

在不同子文件夹中添加多个文件的解决方案:

for file in $(find ./ -type f -name "*@*.png"); do svn add $file@; done

只需将“ @.png”中的“ png”替换为您想要添加的文件类型。

对于带有2个参数(如“ move”)的 svn 命令,必须在 left (first)参数中附加“@”只有:

$ svn add README@txt@
A         README@txt


$ svn move README@txt@ README2@txt
A         README2@txt
D         README@txt




$ svn status
A       README2@txt


$ svn commit -m "blah"
Adding         README2@txt
Transmitting file data .
Committed revision 168.


$ svn delete README2@txt@
D         README2@txt


$ svn commit -m "blahblah"
*Deleting       README2@txt


Committed revision 169.

这条线很重要: $svn move README@txt@README2@txt

如您所见,我们不需要在“ README2@txt”后面附加“@”

要添加多个文件,还有其他解决方案:

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add

只要加上

@

不管是什么 SVN 命令,都可以在需要使用的文件的顶部,例如:

file@2x.jpg

file@2x.jpg@

对我来说唯一有效的解决方案就是@NPike 提出的相同建议

Svn 将‘ path/to/filename@ext@’恢复为‘ path/to/filename@ext@’

今天我遇到了从电子邮件地址生成文件名的问题(这不是一个好主意!)。

解决方案,使用 findprintf选项和 shell 扩展

 svn add  $(find . -name "*@*.png" -printf "%p@ ")