Git存储库中的.gitignore文件中/dir
和/dir/
之间是否存在差异?
以下有何不同?
/dir
/dir/
/dir/*
答案 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/
匹配作为目录的frotz
和a/frotz
(所有路径都是.gitignore
文件的相对路径)。星号“
*
”与除斜杠之外的所有内容匹配。
字符“?
匹配除“/
”之外的任何一个字符。
范围符号,例如[a-zA-Z]
,可用于匹配范围内的一个字符。
有关更多详细说明,请参见fnmatch(3)和FNM_PATHNAME
标志。