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
即顶层目录有两个文件a
和b
,一个目录dir
。在 dir
里面有两个文件 a
和 b
,还有另一个目录 sub
,在最后一个目录中有两个文件 a
和 b
.
在您的 .gitignore
中列出 a
意味着 忽略所有名为 a
、1 的文件这样就涵盖了六个文件中的三个。
但是,在您的 .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"...
此模式正常工作:
**/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
即顶层目录有两个文件a
和b
,一个目录dir
。在 dir
里面有两个文件 a
和 b
,还有另一个目录 sub
,在最后一个目录中有两个文件 a
和 b
.
在您的 .gitignore
中列出 a
意味着 忽略所有名为 a
、1 的文件这样就涵盖了六个文件中的三个。
但是,在您的 .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"...