【问题标题】:What does backslash mean in this Git Add Example这个 Git 添加示例中的反斜杠是什么意思
【发布时间】:2017-03-22 15:29:22
【问题描述】:

我正在阅读 Git 参考中的 Git 添加文档:

Documentation 目录及其子目录下的所有*.txt 文件中添加内容:

$ git add Documentation/\*.txt

请注意,星号* 在此示例中是从shell 中引用的; 这让命令包含来自子目录的文件 Documentation/目录。

我认为是反斜杠 是一个转义前缀,但是解释说“*是从shell中引用的”,有人可以在这里给我更多关于反斜杠用法的说明吗?

【问题讨论】:

    标签: git shell


    【解决方案1】:

    在 Bash 手册中,3.5.8 Filename Expansion3.5.8.1 Pattern Matching 中描述了确切的行为。 (请注意,bash 相当复杂,它处理命令行参数的步骤很长。)

    “引用”一词通常用于表示“从中删除特殊含义”。命令行git add Documentation/*.txt 调用shell 中的特殊行为:bash 将参数替换为一些文件名。如果你改为写git add Documentation/\*.txt,你有引用*:这个过程不会发生,参数不变地传递给程序。

    编写此命令的另一种方式是git add 'Documentation/*.txt',这可能更明显为什么它通常被称为“引用”。使用反斜杠(或其他)字符来改变后面字符的含义有时称为 转义。 (这可能源于对 ascii 字符 27 和/或 Esc 键的使用。)

    有时它是双向的:\* 可能会导致 * 被视为普通字符,但 \n 可能会为普通的 n 赋予特殊含义。这取决于特定的程序。

    【讨论】:

    • 感谢您的澄清,那么“git add Documentation/*.txt”是否意味着:将文档下的“*.txt”文件添加到索引中?但是我看到示例的解释说:添加* .txt“在文档及其子目录下”。在我看来:它添加了直接在文档文件夹下的文件模式,但不在文档的子目录中。对吗?
    • 是的。 git 会将其视为 pathspec,这与 shell glob 有一定的区别。 git-scm.com/docs/…stackoverflow.com/questions/27711924/…
    • 看了你的回复,我推断原文档中的解释是正确的,因为git把那个pattern(Documentation/*.txt)当作pathspec,并且根据链接(git-scm.com/docs/… ) 你给了,它说:“* 和?可以匹配目录分隔符”,所以 git 中的“Documentation/*.txt”可以匹配 Docmentation/john.txt 或 Documentation/users/tom.txt 文件。我的想法对吗?
    【解决方案2】:

    如果你写 git add Documentation/*.txt,星号 (*) 会被 shell 扩展,如 Josh Lee's answer 中所述。如果你写git add Documentation/\*.txt,星号会被 git 扩展。结果通常是相同的,但是有一些极端情况。例如,如果文档文件夹中的文件过多,前一个选项可能会失败,但后一个选项会起作用。

    【讨论】:

      猜你喜欢
      • 2022-08-09
      • 2013-10-24
      • 2021-06-15
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多