gitignore 中 * 和 /* 的区别

Lor*_*hen 5 git gitignore

当我与设置进行比较时,我发现/**有不同的方法:

*

!/init.el
!/README.md
!.gitignore
!/lib/
Run Code Online (Sandbox Code Playgroud)

VS

/*

!/init.el
!/README.md
!.gitignore
!/lib/
Run Code Online (Sandbox Code Playgroud)

前者不跟踪,/lib/但后者跟踪它。

如何理解*/*

更新
我认为这个问题与另一个问题并不完全相同。因为他是专注于dir/**和的,dir/*而这个是专注于/*和的*

tor*_*rek 4

答案有点复杂,因为 Git 的扫描算法很棘手,但归根结底是匹配*lib/custom-file.el/*匹配的事实。

\n\n

作为一般规则,在 glob 模式中,*不会“交叉”路径名分隔符/-es。因此A*B匹配ANameThatEndsInB但不匹配ADirectory/WithAFileB

\n\n

将 a 放入/glob 模式中要求目录名称之前的内容和目录名称/之后的内容:确实匹配。名称组件和分别与全局组件和进行匹配。/A*/*B ADirectory/WithAFileBADirectoryWithAFileBA**B

\n\n

结尾的glob 模式/(如 中)*/匹配目录。以开头的在Git 中具有另一种特殊含义(但请注意,例如,该条目由两个部分组成:和 then ;该部分以斜杠开头)。特别是,如果该模式以 开头,则它仅适用于该 Git 目录顶层的文件。如果这是顶层,那么这意味着工作树本身的根。/.gitignore/foo/bar//foo/bar/bar//.gitignore

\n\n

现在,正如Mad Physicist 的回答一样,如果 Git 在目录中没有现有的跟踪文件,Git有时不必读取该目录。如果 Git 因其他原因不必扫描该目录,则与目录名称匹配的忽略模式将使 Git跳过该目录的扫描。所以一般来说,如果你在任何地方都有一个.gitignore*任何目录都会被完全跳过 \xe2\x80\x94well,只要 Git 还没有因为其他原因而必须查看它的内部。所以*在a中.gitignore往往会忽略所有目录。然而,Git 的忽略规则规定,每当 Git 拥有文件或目录名并检查.gitignore文件时,它都应该读取整个文件并找到所有!匹配项,包括前面带有 的匹配项。这意味着,例如:

\n\n
*\n!*/\n
Run Code Online (Sandbox Code Playgroud)\n\n

会告诉 Git 忽略所有内容(包括目录),但通过说不要忽略*/目录来覆盖它。但*将继续忽略所有文件。

\n\n

如果你让它读:

\n\n
/*\n!/*/\n
Run Code Online (Sandbox Code Playgroud)\n\n

您将忽略此目录中的所有文件(包含 的文件.gitignore),但让 Git 扫描其所有子目录。任何子目录中的所有内容(例如)foo/name都将无法匹配这些 glob 模式中的任何一个,因为该foo/name部分有斜杠并且*不能交叉它。

\n