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

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

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

svn info'test @ .txt'svn:Syntax error parsing revision'.txt'

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

从SVN书 (强调增加):

感知型读者可能想知道在这一点上,peg修订版本语法是否会导致工作副本path或实际上具有标志的URL。 毕竟, svn怎么知道news@11是否是我树中的一个目录的名字,或者只是“ 新闻修订版11”的语法? 值得庆幸的是,虽然svn将总是假设后者,但是有一个简单的解决方法。 你只需要在path的末尾附加一个at符号 ,比如news@11@svn只关心参数中的最后一个符号,在符号之后忽略字面peg修订说明符并不认为是非法的。 此解决方法甚至适用于以符号结尾的path – 您将使用filename@@来讨论名为filename @的文件。

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

 svn info 'image@2x.png@' 

要么

 svn info "image@2x.png@" 

要么

 svn info image\@2x.png\@ 

我只是testing了这三个。

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

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

只需将“ @ .png”中的“png”replace为您要添加的文件types即可。

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

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

这不会工作:

 svn remove 'src/assetshttp://img.dovov.comhi_res/locales-usa@2x.png' 

但是这样做了:

 svn remove 'src/assetshttp://img.dovov.comhi_res/locales-usa@2x.png@' 

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

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

只需添加

@

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

 file@2x.jpg 

 file@2x.jpg@ 

对于带有2个参数(如“move”)的svn命令, 只能在左边(第一个)参数中加上“@”。 例如:

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

@大卫H

我只是尝试了一个类似的命令,而不逃避@符号,它仍然正常工作

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

这是GNU bash,版本3.2.48(1) – 释放(x86_64-apple-darwin10.0)和svn 1.6.16