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

时间:2009-04-16 18:25:46

标签: svn escaping

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

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

  

svn info'test @ .txt'   svn:语法错误解析修订版'.txt'

我尝试过双引号和单引号以及使用'/','\'和'@'转义。如何告诉Subversion将@符号视为文件名的一部分?

11 个答案:

答案 0 :(得分:277)

SVN book(强调添加):

  

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

答案 1 :(得分:82)

原始答案是正确的,但也许不够明确。特定的unix命令行选项如下:

svn info 'image@2x.png@'

svn info "image@2x.png@"

svn info image\@2x.png\@

我刚测试了这三个。

答案 2 :(得分:14)

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

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

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

答案 3 :(得分:11)

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

答案 4 :(得分:9)

只需添加

  

@

在你需要使用的文件中,无论它是什么SVN命令,例如:

file@2x.jpg

file@2x.jpg@

答案 5 :(得分:8)

在我的情况下,我需要从包含@符号的SVN仓库中删除文件:

这不起作用:

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

但是这样做了:

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

答案 6 :(得分:5)

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

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

答案 7 :(得分:1)

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

$ 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”附加“@”

答案 8 :(得分:0)

@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

答案 9 :(得分:0)

对我有用的唯一解决方案与@NPike建议相同

svn revert' path / to / filename @ ext @'

答案 10 :(得分:0)

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

解决方案,使用printf的{​​{1}}选项和shell扩展

find