Svn 如何在Subversion管理的文件名中转义@字符?
对于许多Subversion操作,在文件或URL参数的末尾附加“@”符号可以使您针对该文件的特定修订。例如,“svn信息测试”。txt@1234“将提供有关test.txt的信息,因为它存在于版本1234中 但是,当文件名包含@时,Subversion将其错误地解释为修订说明符: svn信息'test@.txt' svn:分析修订版“.txt”时出现语法错误 我尝试了双引号和单引号以及用“/”、“\”和“@”转义。如何告诉Subversion将@符号视为文件名的一部分?来自(添加了强调): 敏锐的读者可能会想知道,此时peg修订语法是否会导致实际包含at符号的复制路径或URL的工作出现问题。毕竟,svn如何知道Svn 如何在Subversion管理的文件名中转义@字符?,svn,escaping,Svn,Escaping,对于许多Subversion操作,在文件或URL参数的末尾附加“@”符号可以使您针对该文件的特定修订。例如,“svn信息测试”。txt@1234“将提供有关test.txt的信息,因为它存在于版本1234中 但是,当文件名包含@时,Subversion将其错误地解释为修订说明符: svn信息'test@.txt' svn:分析修订版“.txt”时出现语法错误 我尝试了双引号和单引号以及用“/”、“\”和“@”转义。如何告诉Subversion将@符号视为文件名的一部分?来自(添加了强调): 敏锐
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@ ")