gitignore 模式在没有双星的情况下不起作用

gitignore pattern doesn't work without double stars

此模式正常工作:

**/Assets/Plugins/Editor/JetBrains*

但是这个模式没有:

Assets/Plugins/Editor/JetBrains*

据我所知,这两种模式是等价的。这可能是什么问题?

**/Assets/Plugins/Editor/JetBrains*
将忽略路径,无论资产的根文件夹是什么,这意味着它可以嵌套。

Assets/Plugins/Editor/JetBrains*
将忽略来自 当前 文件夹

的路径字符串

**/表示可以"nested"在当前路径所在位置下的任意文件夹内

As far as I know, these two patterns are equivalent.

他们不是。

Git 有一个记录不完整的偷偷摸摸的功能(错误?烦恼?随便你怎么称呼它,虽然它意味着一个功能)其中 .gitignore 文件中的 glob 模式有时是锚定或扎根——这里不清楚用什么词——有时不用。我认为最好用例子来解释。

假设您有以下文件:

/a
/b
/dir/a
/dir/b
/dir/sub/a
/dir/sub/b

即顶层目录有两个文件ab,一个目录dir。在 dir 里面有两个文件 ab,还有另一个目录 sub,在最后一个目录中有两个文件 ab.

在您的 .gitignore 中列出 a 意味着 忽略所有名为 a1 的文件这样就涵盖了六个文件中的三个。

但是,在您的 .gitignore 中列出 /a 意味着 仅在顶层忽略名为 a 的文件,即仅忽略一个文件。

斜线出现在 除结尾 以外的任何位置触发此功能,因此在顶级文件中列出 dir/a 意味着 仅忽略 dir 目录中名为 a 的文件 ,即仅 /dir/a。如果我们创建一个新文件 dir/sub/dir/a,那将 而不是 被忽略:dir/a/dir/a 的意思相同。

人们可能只希望使用 leading 斜杠来执行此操作,但实际上,它是 any 斜杠,except最后,就是这样做的。 except at the end 部分意味着如果您在顶层 .gitignore 中列出 sub/,Git 将忽略 [=36= 中的两个文件], 因为在应用 "contains a slash" 规则之前从末尾删除了斜杠,然后在 "matches a directory" 规则的末尾放回斜杠。

结果是,如果您打算在 任何 级别忽略 Assets/Plugins/Editor/JetBrains*,而不仅仅是当前级别(这个特定的 .gitignore 文件位于你的工作树)——你需要 **/ 前缀。

请注意,您可以在 每个 级别有一个 .gitignore 文件,因此您可以只找到名为 Editor 的目录,如果它们位于Assets/Plugins/ 包含目录,在此处创建一个 .gitignore 列出 JetBrains*。这与在顶层写 **/Assets/Plugins/Editor/JetBrains* 具有相同的效果。


1Ignore真是动词错误。如果一个文件已经被跟踪,它就不会被忽略;在 .gitignore 中列出文件意味着 如果该文件未被跟踪,请不要抱怨该文件,也不要使用 en-masse "add all files" 命令自动添加它。它还授予 Git 在某些情况下破坏文件的权限。但是调用文件 .git-dont-complain-about-untracked-and-dont-auto-add-and-sometimes-feel-free-to-clobber-these-files 会很笨拙,所以我们说 "ignore"...