.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
位于根目录级别)。