【问题标题】:How to escape @ characters in Subversion managed file names?如何在 Subversion 托管文件名中转义 @ 字符?
【发布时间】:2009-04-16 18:25:45
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么你的文件名中有@?自找麻烦,如果你问我... :-)
  • 非常好的问题! :) 我正在接手一个项目,其中这个字符是文件命名约定的基本组成部分,不幸的是,这在不久的将来无法更改。
  • Apple 从 iOS 4+ 开始为其所有 iOS 开发人员创建了此约定。所有用于高分辨率显示的资源都应命名为@2x...
  • ghetto 旧式 Matlab OO 标准
  • 另外,如果你从 Thunderbird 的 Enigmail 保存你的私钥或撤销密钥,它会创建一个文件名——考虑到应用程序,这不是不合理的——包含一个 at 符号

标签: svn escaping


【解决方案1】:

来自SVN book(强调添加):

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

【讨论】:

  • 请注意,要使用“svn diff”,您需要添加修订参数。 “svn up @file@”有效,但“svn diff @file@”无效。你需要使用“svn diff -r HEAD @file@”
  • SVN 书的注意事项:文件可以不带扩展名而存在,即使在 Windows 上也是如此,因此 news@11 也可以是一个文件。
  • 请注意,对于某些命令,例如重命名,参数可以是版本化项或本地文件名。在重命名的情况下,目标也会被扫描以查找固定修订,但之后可能会被视为普通名称。比如你想把@foo重命名为@barsvn rename @foo@ @bar就会报错@bar;但是,如果您将其命名为svn rename @foo@ @bar@,则新名称实际上将是@bar@。为避免这种情况,请添加./(或Windows 上的.\ )以明确它是本地路径:svn rename @foo@ ./@bar
【解决方案2】:

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

svn info 'image@2x.png@'

svn info "image@2x.png@"

svn info image\@2x.png\@

我刚刚测试了所有三个。

【讨论】:

  • 我还测试了svn info icon@2x.png@,它也有效。是的,没有引号或斜线!
  • 引用的必要性取决于您的外壳 - 我使用 KSH 并且您肯定需要引号(因为“@”是您希望进程在后台运行的标志)。 YMMV 取决于外壳。
  • 是的。我的里程是在bash 高速公路上:)
  • @Nate 现在我不能让它失败 - 如果没有 ksh 中的引号,它可以正常工作。我不知道为什么我认为我需要它们 - 也许是其他问题 - 这是 2 年前我发布的......
【解决方案3】:

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

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 存储库的文件/目录结构与工作本地副本不一致吗?
  • 使用 exec 的 find 可能更容易:find . -type f -name "*@*.png" -exec svn add {}@ \;
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    只需添加

    @

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

    file@2x.jpg
    

    file@2x.jpg@
    

    【讨论】:

      【解决方案6】:

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

      这行不通:

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

      但是这样做了:

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

        • 请解释你的答案。
        • 您可以使用 awk 代替 grep:svn status | awk '/\.png/ {print $2"@"}'| xargs svn add
        【解决方案8】:

        对于带有 2 个参数的 svn 命令,例如“move”,您必须在左侧(第一个)参数处附加“@”。例如:

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

        【讨论】:

          【解决方案9】:

          @大卫 H

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

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

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

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

            • 您确定这应该是对原始问题的回复吗?这应该是一个赞成或评论
            • 对不起,我的错,我还不能添加评论
            【解决方案11】:

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

            解决方案,使用findprintf 选项,以及shell 扩展

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

            【讨论】:

              猜你喜欢
              • 2015-02-03
              • 2023-03-06
              • 2016-07-24
              • 2014-07-09
              • 2010-09-11
              • 1970-01-01
              • 2010-11-14
              • 1970-01-01
              • 2018-07-24
              相关资源
              最近更新 更多