.gitignore规则之间的区别,不pipe是/ dir还是/ dir /

Git仓库中的.gitignore文件中的/dir/dir/有区别吗?

以下情况如何?

 /dir /dir/ /dir/* 

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

两者都会匹配一个名为dir

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

模式有不同的含义

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

  • 如果模式以斜线结尾,则为了以下描述的目的将其移除,但是它只能find与目录匹配的内容。 换句话说,foo /会匹配一个目录foo和它下面的path,但是不会匹配一个普通的文件或符号链接foo(这与pathspec在git中的工作方式是一致的)。

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

这意味着“dir”可以是一个文件,目录或者符号链接,但是“dir /”后面的斜杠只能匹配一个目录。 在大多数情况下,这种差异并不重要,但是当它理解了这个区别之后,就可以消除.gitignore文件中的歧义。

这是一个古老的问题,但高排名在谷歌和顶级投票答案是错误的 。 这里是正确的答案。

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

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

/dir/dir//dir/* 相等。 使用覆盖规则时的差别非常明显,比如着名的!.gitkeep来解决追踪空目录的限制。 假设文件dir/.gitkeep存在

  • 使用/dir/dir/ ,Git甚至不会在目录里面看到.gitkeep
  • 使用/dir/* ,这个文件将被Git检测到,如果这个.gitkeep被提交,这个目录将被保留,因为这个规则不适用于目录本身,只适用于它的内容。

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