首页 > 解决方案 > 澄清 gitignore 文档

问题描述

我不明白gitignore文档中的一些陈述:https ://git-scm.com/docs/gitignore

我不明白的部分以粗体显示。我的问题是斜体的。

  1. 如果模式以斜线结尾,则出于以下描述的目的将其删除

什么被删除?什么是“以下描述”?

  1. 如果模式不包含斜杠 /,Git 将其视为 shell glob 模式并检查与 .gitignore 文件位置相关的路径名是否匹配 [..]否则,Git 会将模式视为 shell glob

“否则”来自什么?他们是否在模式中对比“有”和“没有”斜线?如果是这样,这两种情况如何区别对待?

  1. 尾随的“/**”匹配里面的所有内容。

/这与没有星号的尾随结果相同吗?从我在关于尾部斜杠的要点中可以看到它看起来像它(“foo / 将匹配目录 foo 和它下面的路径”)。

您是否也觉得此文档令人困惑?如果是这样,向 Git 团队发出信号的最佳方式是什么?(邮件列表或问题跟踪器?)。

标签: git

解决方案


我还发现旧的描述非常混乱。我创建了一个 PR 来改进规则。我觉得现在好多了。

这里是新文档的摘录。

斜杠 / 用作目录分隔符。分隔符可能出现在 .gitignore 搜索模式的开头、中间或结尾。

如果模式的开头或中间(或两者)有分隔符,则该模式是相对于特定 .gitignore 文件本身的目录级别的。否则,模式也可能在 .gitignore 级别以下的任何级别匹配。

如果模式末尾有分隔符,则该模式将仅匹配目录,否则该模式可以匹配文件和目录。

例如,模式 doc/frotz/ 匹配 doc/frotz 目录,但不匹配 /doc/frotz 目录;但是 frotz/ 匹配 frotz 和 a/frotz 是一个目录(所有路径都是 .gitignore 文件的相对路径)。


不过,这里是您问题的答案:

如果模式以斜线结尾,则出于以下描述的目的将其删除

什么被删除?什么是“以下描述”?

这意味着在提到斜杠时会排除尾部斜杠。但它实际上只影响下一段。

如果模式不包含斜杠 /,Git 将其视为 shell glob 模式并检查与 .gitignore 文件位置相关的路径名是否匹配 [..]否则,Git 会将模式视为 shell glob

“否则”来自什么?他们是否在模式中对比“有”和“没有”斜线?如果是这样,这两种情况如何区别对待?

因此,考虑到上述解释,第一段的意思是:

如果模式不包含斜线“/”,除了尾部斜线,则该模式将在所有目录中匹配。

换句话说,foo/将匹配/bar/foo/foo将匹配/bar/foo

而“其他部分”是指:

如果模式包含斜杠“/”而不是尾部斜杠,则始终从根开始考虑。

换句话说,foo/bar 将匹配/foo/bar但不匹配/bar/foo/bar

尾随的“/**”匹配里面的所有内容。

/这与没有星号的尾随结果相同吗?从我在关于尾部斜杠的要点中可以看到它看起来像它(“foo / 将匹配目录 foo 和它下面的路径”)。

有细微的差别。foo/将忽略文件夹,而foo/**将忽略文件夹及其内容。

因此,如果这是您的文件结构:

  .gitignore
  foo
    ├── bar.json
    └── foo.txt

那么以下 .gitignore 文件将跟踪所有内容:

foo/
!foo/

然而

foo/**
!foo/

什么都不会追踪。因为您首先忽略所有文件,然后您取消忽略该文件夹/foo,但由于该文件夹没有可跟踪的文件,它是空的,空文件夹不被 git 跟踪。


推荐阅读