带有和不带斜杠的.gitignore规则之间的区别如/ dir和/ dir /

时间:2013-07-26 18:39:57

标签: git gitignore

Git存储库中的.gitignore文件中/dir/dir/之间是否存在差异?

以下有何不同?

/dir
/dir/
/dir/*

4 个答案:

答案 0 :(得分:36)

是。 /dir将匹配名为dir的文件; /dir/不会。

两者都匹配名为dir的目录。

/dir//dir/*是等效的。

答案 1 :(得分:28)

这是一个老问题,但谷歌排名很高,而且最高投票的答案是错误。这是正确的答案。

是的,这些规则是不同的。

  • /dir将匹配文件,目录,链接以及名为dir
  • 的所有内容
  • /dir/仅匹配 名为dir的目录
  • /dir/*将匹配所有文件,目录和其他内容 一个名为dir的目录(但不是dir目录本身)。

/dir/dir//dir/* NOT 等效。区别 在使用覆盖规则时非常清楚,例如着名的!.gitkeep 绕过跟踪空目录的限制。假设 文件dir/.gitkeep

的存在
  • 使用/dir/dir/,Git甚至不会查看目录 所以.gitkeep似乎不会出现。
  • 使用/dir/*,Git和目录将检测到该文件 如果提交此.gitkeep,将会保留,因为规则 不适用于目录本身,仅适用于其内容。

OBS :上述所有规则都锚定在当前目录中 (.gitignore所在的位置),因为/前缀。 如果没有前缀,规则将不仅适用于该特定目录,还适用于子目录或存储库中的任何位置, 如果.gitignore位于根级别。

答案 2 :(得分:26)

模式具有不同的含义

根据gitignore(5)的模式格式部分:

  
      
  • 如果模式以斜杠结尾,则为了以下描述的目的将其删除,但它只会找到与目录的匹配项。换句话说,foo /将匹配目录foo和它下面的路径,但是不匹配常规文件或符号链接foo(这与pathpec在git中的工作方式一致)。

  •   
  • 如果模式不包含斜杠/,git会将其视为shell glob模式,并检查相对于.gitignore文件位置的路径名匹配(相对于工作树的顶层)如果不是来自.gitignore文件)。

  •   

这意味着“dir”可以是文件,目录或符号链接,但带有尾部斜杠的“dir /”只能匹配目录。在大多数情况下,差异无关紧要,但是当它理解时,区别可以消除.gitignore文件中的歧义。

答案 3 :(得分:0)

Git 2.23(2019年第三季度)尝试修改有关gitignore模式中的斜杠的描述(用于表示“仅锚定到此级别”和“仅 匹配目录”)

The documentation现在包括:

  
      
  • 斜杠'/'用作目录分隔符。
      分隔符可以出现在.gitignore搜索模式的开头,中间或结尾。

  •   
  • 如果在模式的开头或中间(或两者)都有分隔符,则该模式是相对于特定.gitignore文件本身的目录级别的。
      否则,模式也可能在.gitignore级别以下的任何级别匹配。

  •   
  • 如果模式末尾有分隔符,则该模式将仅匹配目录,否则该模式可以同时匹配文件和目录。

  •   
  • 例如,模式doc/frotz/匹配doc/frotz目录,但不匹配a/doc/frotz目录;
      但是frotz/匹配作为目录的frotza/frotz(所有路径都是.gitignore文件的相对路径)。

  •   
  • 星号“ *”与除斜杠之外的所有内容匹配。
      字符“ ?匹配除“ /”之外的任何一个字符。
      范围符号,例如[a-zA-Z],可用于匹配范围内的一个字符。
      有关更多详细说明,请参见fnmatch(3)和FNM_PATHNAME标志。

  •