Svn 如何在Subversion管理的文件名中转义@字符?

Svn 如何在Subversion管理的文件名中转义@字符?,svn,escaping,Svn,Escaping,对于许多Subversion操作,在文件或URL参数的末尾附加“@”符号可以使您针对该文件的特定修订。例如,“svn信息测试”。txt@1234“将提供有关test.txt的信息,因为它存在于版本1234中 但是,当文件名包含@时,Subversion将其错误地解释为修订说明符: svn信息'test@.txt' svn:分析修订版“.txt”时出现语法错误 我尝试了双引号和单引号以及用“/”、“\”和“@”转义。如何告诉Subversion将@符号视为文件名的一部分?来自(添加了强调): 敏锐

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

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

svn信息'test@.txt' svn:分析修订版“.txt”时出现语法错误

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

来自(添加了强调):

敏锐的读者可能会想知道,此时peg修订语法是否会导致实际包含at符号的复制路径或URL的工作出现问题。毕竟,svn如何知道
news@11
是我的目录树中的目录名还是“新闻第11版”的语法?谢天谢地,虽然svn总是假设后者,但有一个简单的解决方法您只需要在路径的末尾附加一个at符号,例如
news@11@
。svn只关心参数中的最后一个at符号,在该at符号之后省略一个literal-peg-revision说明符并不违法。此解决方法甚至适用于以at符号结尾的路径,您可以使用
filename@
来谈论名为filename@.


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

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

svn info 'image@2x.png@'

我刚刚测试了所有三个。

@davidh

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

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

这是在GNU bash版本3.2.48(1)-发行版(x86_64-apple-darwin10.0)和svn 1.6.16上的。在我的例子中,我需要从包含@符号的svn repo中删除文件:

这是行不通的:

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”替换为您要添加的文件类型。

对于具有两个参数(如“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 moveREADME@txt@ README2@txt


如您所见,我们不需要在README2@txt“

要添加多个文件,有另一种解决方案:

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add
简单地加上

@

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

file@2x.jpg


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


svn还原路径/到/filename@ext@“

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

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

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

究竟为什么文件名中有@?自找麻烦,如果你问我…:-)很好的问题!:)我正在接管一个项目,在这个项目中,这个字符是文件命名约定的一个基本组成部分,不幸的是,这在不久的将来是无法改变的。从iOS 4+开始,苹果为其所有iOS开发者创建了这个约定。如果用于高分辨率显示,所有资产都应命名为@2x……这是犹太人区旧式Matlab的标准。此外,如果您从Thunderbird's Enigmail中保存私钥或吊销密钥,它会创建一个文件名——考虑到应用程序,这是不合理的——其中包含一个at signNote,要使用“svn diff”,您需要添加修订参数。“svn up@file@”有效,但“svn diff@file@”无效。您需要在svn手册中使用“svn diff-r HEAD@file@”注释:文件可以不带扩展名而存在,即使在Windows上,因此
news@11
也可以是文件。请注意,对于某些命令(如重命名),参数可以是版本控制的项或本地文件名。在重命名的情况下,还将扫描目标以查找固定的修订,但之后可能会将其视为普通名称。例如,如果您想将
@foo
重命名为
@bar
svn rename@foo@bar
将投诉
@bar
;但如果您将其命名为
svn rename@foo@@bar@
,则新名称将按字面意思为
@bar@
。为了避免这种情况,请添加
/
(或windows上的
\
)以明确它是本地路径:
svn rename@foo@/@bar
。我还测试了
svn infoicon@2x.png@
而且它也起了作用。是的,没有引号或斜杠!引用的必要性取决于您的shell-我使用KSH,并且您肯定需要引用(因为“@”表示您希望在后台运行进程)。YMMV取决于shell.Yep。我的里程数是在
bash
highway:)@Nate现在我不能让它失败——如果没有ksh中的引号,它工作正常。我不知道为什么我认为我需要它们-可能是其他问题-这是2年前我发布的…请务必引用或转义您的文件名(并进行不区分大小写的匹配)。另外,不需要将文件名中包含
@
的文件作为特例处理,您可以安全地将
@
符号附加到所有文件名上:
用于文件名,单位为$(find./-type f-iname“*.png”);是否添加“$file@”;完成
。此外,这种方法不会使svn repo的文件/目录结构与工作的本地副本不一致吗?使用find的
exec
可能是eaiser:
find-键入f-名称“*@*.png”-exec svn add{}@
请解释您的答案。您可以使用awk而不是grep:
svn status|awk'/\.png/{print$2@'}xargs svn add
您确定这应该是对原始问题的新回答吗?这应该是一个向上投票或评论对不起,我的错,我还不能添加评论
file@2x.jpg
file@2x.jpg@
 svn add  $(find . -name "*@*.png" -printf "%p@ ")