这种模式正常工作:
**/Assets/Plugins/Editor/JetBrains*
Run Code Online (Sandbox Code Playgroud)
但这种模式不会:
Assets/Plugins/Editor/JetBrains*
Run Code Online (Sandbox Code Playgroud)
据我所知,这两种模式是等价的.这可能是什么问题?
据我所知,这两种模式是等价的.
他们不是.
Git有一个记录不清的偷偷摸摸的功能(错误?烦恼?无论你喜欢什么,尽管它的意思是作为一个功能),文件中的glob模式.gitignore有时会被锚定或生根 - 这里不清楚用什么词 - 和有时不.我认为最好用例子来解释.
假设您有以下文件:
/a
/b
/dir/a
/dir/b
/dir/sub/a
/dir/sub/b
Run Code Online (Sandbox Code Playgroud)
也就是说,顶级目录下有两个文件,a并b和一个目录dir.里面dir有两个文件a和b另一个目录sub,在最后一个文件中有两个文件a和b.
a以您的.gitignore方式列出忽略名为a1的所有文件,以便涵盖六个文件中的三个.
但是,/a以您的.gitignore方式列出忽略a仅在顶级命名的文件,即忽略一个文件.
除了触发此功能的结尾之外的任何位置都存在斜杠,因此列dir/a在顶级文件中意味着忽略仅a在dir目录中命名的文件,即,仅/dir/a.如果我们创建了一个新文件dir/sub/dir/a,那就不会被忽略了:dir/a意思是相同的/dir/a.
人们可能期望只有一个领先的斜线才能做到这一点,但事实上,除了最后,它是任何斜线,这样做.最后部分的除外意味着如果你在顶层列出,Git将忽略其中的两个文件,因为在应用"包含斜杠"规则之前从结尾删除斜杠,然后将结尾放回到"匹配目录"规则.sub/.gitignoredir/sub
结果是,如果您想Assets/Plugins/Editor/JetBrains*在任何级别忽略- 不仅仅是当前级别(此特定.gitignore文件位于工作树中的任何位置) - 您需要**/前缀.
请注意,您可以.gitignore在每个级别拥有一个文件,因此您可以只查找名为的目录Editor,如果它们位于Assets/Plugins/包含目录中,则创建一个.gitignore列出的位置JetBrains*.这与**/Assets/Plugins/Editor/JetBrains*在顶级写作具有相同的效果.
1 忽略真的是错误的动词.如果已经跟踪过文件,则不会忽略该文件; 以文件.gitignore形式列出文件如果没有跟踪则不会抱怨该文件,并且不会自动添加一个"添加所有文件"命令. 它还授予Git在某些情况下破坏文件的权限.但调用该文件.git-dont-complain-about-untracked-and-dont-auto-add-and-sometimes-feel-free-to-clobber-these-files将是非常的,所以我们说"忽略"......