当我与设置进行比较时,我发现/*并*有不同的方法:
*
!/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/*而这个是专注于/*和的*。
答案有点复杂,因为 Git 的扫描算法很棘手,但归根结底是匹配*但lib/custom-file.el不/*匹配的事实。
作为一般规则,在 glob 模式中,*不会“交叉”路径名分隔符/-es。因此A*B匹配ANameThatEndsInB但不匹配ADirectory/WithAFileB。
将 a 放入/glob 模式中要求目录名称之前的内容和目录名称/之后的内容:确实匹配。名称组件和分别与全局组件和进行匹配。/A*/*B ADirectory/WithAFileBADirectoryWithAFileBA**B
以结尾的glob 模式/(如 中)仅*/匹配目录。以开头的在Git 中具有另一种特殊含义(但请注意,例如,该条目由两个部分组成:和 then ;该部分不以斜杠开头)。特别是,如果该模式以 开头,则它仅适用于该 Git 目录顶层的文件。如果这是顶层,那么这意味着工作树本身的根。/.gitignore/foo/bar//foo/bar/bar//.gitignore
现在,正如Mad Physicist 的回答一样,如果 Git 在目录中没有现有的跟踪文件,Git有时不必读取该目录。如果 Git 因其他原因不必扫描该目录,则与目录名称匹配的忽略模式将使 Git跳过该目录的扫描。所以一般来说,如果你在任何地方都有一个.gitignore,*任何目录都会被完全跳过 \xe2\x80\x94well,只要 Git 还没有因为其他原因而必须查看它的内部。所以*在a中.gitignore往往会忽略所有目录。然而,Git 的忽略规则规定,每当 Git 拥有文件或目录名并检查.gitignore文件时,它都应该读取整个文件并找到所有!匹配项,包括前面带有 的匹配项。这意味着,例如:
*\n!*/\nRun Code Online (Sandbox Code Playgroud)\n\n会告诉 Git 忽略所有内容(包括目录),但通过说不要忽略*/目录来覆盖它。但*将继续忽略所有文件。
如果你让它读:
\n\n/*\n!/*/\nRun Code Online (Sandbox Code Playgroud)\n\n您将忽略此目录中的所有文件(包含 的文件.gitignore),但让 Git 扫描其所有子目录。任何子目录中的所有内容(例如)foo/name都将无法匹配这些 glob 模式中的任何一个,因为该foo/name部分有斜杠并且*不能交叉它。
| 归档时间: |
|
| 查看次数: |
1153 次 |
| 最近记录: |