此模式正常工作:
**/Assets/Plugins/Editor/JetBrains*
但这种模式不会:
Assets/Plugins/Editor/JetBrains*
据我所知,这两种模式是等价的 . 这可能是什么问题?
据我所知,这两种模式是等价的 .
他们不是 .
Git有一个记录不清的偷偷摸摸的功能(错误?烦恼?不管你喜欢什么,尽管它的意思是一个功能),其中 .gitignore 文件中的glob模式有时会被锚定或生根 - 它不清楚在这里使用什么词 - 有时候不是 . 我认为最好用例子来解释 .
.gitignore
假设您有以下文件:
/a /b /dir/a /dir/b /dir/sub/a /dir/sub/b
也就是说,顶级目录有两个文件 a 和 b ,以及一个目录 dir . 在 dir 里面有两个文件 a 和 b ,另一个目录是 sub ,在最后一个文件中有两个文件 a 和 b .
a
b
dir
sub
在 .gitignore 中列出 a 意味着忽略所有名为 a 的文件,1这样就覆盖了六个文件中的三个 .
但是,在 .gitignore 中列出 /a 表示仅在顶级忽略名为 a 的文件,即忽略一个文件 .
/a
除了触发此功能的结尾之外的任何位置都存在斜杠,因此在顶级文件中列出 dir/a 意味着仅忽略 dir 目录中名为 a 的文件,即仅 /dir/a . 如果我们创建了一个新文件 dir/sub/dir/a ,那将不会被忽略: dir/a 表示与 /dir/a 相同 .
dir/a
/dir/a
dir/sub/dir/a
人们可能期望只有一个领先的斜线才能做到这一点,但事实上,除了最后,它是任何斜线,这样做 . 末尾部分的除外意味着如果你在 .gitignore 的顶级列出 sub/ ,Git将忽略 dir/sub 中的两个文件,因为在应用"contains a slash"规则之前从末尾删除了斜杠,然后将"matches a directory"规则放回到最后 .
sub/
dir/sub
结果是,如果您想在任何级别忽略 Assets/Plugins/Editor/JetBrains* - 而不仅仅是当前级别(此特定 .gitignore 文件位于工作树中的任何位置) - 您需要 **/ 前缀 .
**/
请注意,您可以在每个级别拥有 .gitignore 文件,因此您可以只找到名为 Editor 的目录,如果它们位于包含 Assets/Plugins/ 的目录中,请在此处创建 .gitignore 列出 JetBrains* . 这与在顶层编写 **/Assets/Plugins/Editor/JetBrains* 具有相同的效果 .
Editor
Assets/Plugins/
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" ...
.git-dont-complain-about-untracked-and-dont-auto-add-and-sometimes-feel-free-to-clobber-these-files
**/Assets/Plugins/Editor/JetBrains*将忽略路径无关紧要资产的根文件夹是什么意味着它可以嵌套 .
Assets/Plugins/Editor/JetBrains*将忽略 the current 文件夹中的路径statring
**/ 表示它可以在当前路径位置下的任何文件夹中"nested"
2 回答
他们不是 .
Git有一个记录不清的偷偷摸摸的功能(错误?烦恼?不管你喜欢什么,尽管它的意思是一个功能),其中
.gitignore
文件中的glob模式有时会被锚定或生根 - 它不清楚在这里使用什么词 - 有时候不是 . 我认为最好用例子来解释 .假设您有以下文件:
也就是说,顶级目录有两个文件
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
相同 .人们可能期望只有一个领先的斜线才能做到这一点,但事实上,除了最后,它是任何斜线,这样做 . 末尾部分的除外意味着如果你在
.gitignore
的顶级列出sub/
,Git将忽略dir/sub
中的两个文件,因为在应用"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*
将忽略 the current 文件夹中的路径statring
**/
表示它可以在当前路径位置下的任何文件夹中"nested"