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


191

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

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

svn信息'test @ .txt'svn:语法错误解析修订'.txt'

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


3
到底为什么在文件名中带有@?自找麻烦,如果您问我... :-)
JesperE

很好的问题!:)我正在接管一个项目,该字符是文件命名约定的基本组成部分,不幸的是,在不久的将来无法更改此字符。
weston

57
自iOS 4+起,Apple为所有iOS开发人员创建了此约定。如果所有资产都用于高分辨率显示,则应将其命名为@ 2x ...
Dimitris

2
标准贫民窟旧式Matlab的OO
Chinasaur

另外,如果您从Thunderbird的Enigmail保存您的私钥或吊销密钥,它会创建一个文件名-给定该应用程序-包含一个at符号
-Peter Flynn

Answers:


283

SVN书中(添加重点):

敏锐的读者可能会怀疑此时钉钉修订版语法是否会导致工作副本路径或URL中实际带有符号的问题。毕竟,svn如何知道news@11我的树中的目录名称还是“ news第 11版”的语法?值得庆幸的是,尽管svn始终假定后者,但有一个简单的解决方法。您只需要在路径末尾附加一个at符号,例如news@11@svn只关心参数中的最后一个符号,在符号后省略文字挂钩修订说明符被认为是非法的。此解决方法甚至适用于以at符号结尾的路径-您可以使用filename@@谈论文件filename @


4
请注意,要使用“ svn diff”,您需要添加修订参数。“ svn up @ file @”有效,但“ svn diff @ file @”无效。您需要使用“ svn diff -r HEAD @ file @”
analytik 2011年

SVN书的注意事项:文件可以不带扩展名存在,即使在Windows上news@11也可以是文件。
trysis '18

1
请注意,对于某些命令(如重命名),参数可以是版本项或本地文件名。在重命名的情况下,还会对目标进行扫描以查找固定的修订版,但之后可能会将其视为纯名称。例如,如果您想重命名@foo@barsvn rename @foo@ @bar则会抱怨@bar;但是如果做到了svn rename @foo@ @bar@,新名称就会字面上了@bar@。为避免这种情况,请添加./(或.\ 在Windows上)以使其清楚是本地路径:svn rename @foo@ ./@bar
Zastai

82

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

svn info 'image@2x.png@'

要么

svn info "image@2x.png@"

要么

svn info image\@2x.png\@

我刚刚测试了全部三个。


4
我也进行了测试svn info icon@2x.png@,它也起作用。是的,没有引号或斜杠!
Nate

引用的必要性取决于您的shell-我使用KSH,并确保您需要使用引号(因为'@'是您要在后台运行进程的标志)。YMMV取决于外壳。
David H

是的 我的里数是在bash高速公路上:)
Nate

1
@Nate现在我不能让它失败-没有ksh中的引号,它可以正常工作。我不知道为什么我以为我需要他们-也许还有其他问题-那是2年前我发布的...
David H

14

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

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

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


确保引用或转义文件名(并区分大小写)。同样,也无需将@名称中带有文件的文件作为特例处理,您可以安全地将@符号附加到所有文件名:中for file in $(find ./ -type f -iname "*.png"); do svn add "$file@"; done。另外,这种方法是否会使您的svn repo的文件/目录结构与工作的本地副本不一致?
ardnew

使用execfind可能更容易:find . -type f -name "*@*.png" -exec svn add {}@ \;
Walty Yeung



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

要添加多个文件,有替代的解决方案:

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

请解释您的答案。
Hemang '16

3
您可以使用awk代替grep:svn status | awk '/\.png/ {print $2"@"}'| xargs svn add
h3dkandi

1

对于带有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”后面附加“ @”


0

@戴维H

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

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

这是在GNU bash,版本3.2.48(1)-发行版(x86_64-apple-darwin10.0)和svn 1.6.16上


0

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

svn恢复'path / to / filename @ ext @'


您确定这应该是对原始问题的答复?这应该是一个赞扬或评论
Nico Haase

抱歉,我不好,我还不能添加评论
Jonyx4 '18

0

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

解决方案,使用 ,和Shell扩展printf选项find

 svn add  $(find . -name "*@*.png" -printf "%p@ ")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.