.gitignore规则与尾随斜杠的区别,如/dir和/dir/
Git存储库中.gitignore文件中的.gitignore规则与尾随斜杠的区别,如/dir和/dir/,git,gitignore,Git,Gitignore,Git存储库中.gitignore文件中的/dir和/dir/之间有区别吗 以下有什么不同 /dir /dir/ /dir/* 这些模式有不同的含义 根据的“图案格式”部分: 如果模式以斜杠结尾,则出于以下描述的目的将其删除,但它只会找到与目录匹配的内容。换句话说,foo/将匹配目录foo及其下的路径,但不会匹配常规文件或符号链接foo(这与pathspec在git中的一般工作方式一致) 如果模式不包含斜杠/,git将其视为shell glob模式,并检查与.gitignore文件位置相关的
/dir
和/dir/
之间有区别吗
以下有什么不同
/dir
/dir/
/dir/*
这些模式有不同的含义
根据的“图案格式”部分:
- 如果模式以斜杠结尾,则出于以下描述的目的将其删除,但它只会找到与目录匹配的内容。换句话说,foo/将匹配目录foo及其下的路径,但不会匹配常规文件或符号链接foo(这与pathspec在git中的一般工作方式一致)
- 如果模式不包含斜杠/,git将其视为shell glob模式,并检查与.gitignore文件位置相关的路径名是否匹配(如果不是来自.gitignore文件,则与工作树的顶层相关)
这意味着“dir”可以是文件、目录或符号链接,但带有尾随斜杠的“dir/”只能与目录匹配。在大多数情况下,差异并不重要,但当它发生时,理解差异可以消除.gitignore文件中的歧义。这是一个老问题,但在谷歌排名靠前,投票结果是错误的。下面是正确的答案 是的,这些规则是不同的
将匹配名为/dir
dir
将只匹配名为/dir/
dir
将匹配所有文件、目录和其中的任何内容 名为/dir/*
(但不是dir
目录本身)的目录dir
/dir
,/dir/
和/dir/*
是不等效的。区别
在使用覆盖规则时非常清楚,如著名的!。gitkeep
以绕过跟踪空目录的限制。假设
文件dir/.gitkeep
- 使用
和/dir
,Git甚至不会查看目录内部 因此,/dir/
将不会被看到.gitkeep
- 使用
,Git和目录将检测文件 如果提交了此/dir/*
,则将保留,因为规则 不适用于目录本身,仅适用于其内容.gitcept
/
前缀,.gitignore
所在的位置)。
如果没有前缀,规则不仅适用于该特定目录,还适用于子目录或存储库中的任何位置,
如果.gitignore
位于根级别。git2.23(2019年第3季度)试图修改gitignore模式中有关斜杠的描述(用于指示“仅锚定到此级别”和“仅
匹配目录“)
现在包括:
- 斜杠“
”用作目录分隔符。/
分隔符可能出现在
搜索模式的开头、中间或结尾.gitignore
- 如果在模式的开头或中间(或两者)有分隔符,则模式与特定
文件本身的目录级别相关。.gitignore
否则,模式也可能在
级别以下的任何级别匹配.gitignore
- 如果模式末尾有分隔符,那么模式将只匹配目录,否则模式可以同时匹配文件和目录
- 例如,模式
匹配doc/frotz/
目录,但不匹配doc/frotz
目录a/doc/frotz
但是
匹配作为目录的frotz/
和frotz
(所有路径都与a/frotz
文件相对).gitignore
- 星号“
”与除斜杠以外的任何东西都匹配。*
字符“
”与除“?
”以外的任何一个字符匹配/
范围符号,例如
,可用于匹配范围中的一个字符。[a-zA-Z]
有关更详细的说明,请参见fnmatch(3)和
标志FNM\u路径名
“OBS”应该是什么意思?@xehpuk For observe/observation
dir/
是否将符号链接与名为dir
的目录匹配?如果是这样的话,这种行为在Git版本中有没有改变?对于我的团队中的每个人来说,它似乎都很匹配,除了一个同事。@0xbe5077ed,理论上符号链接只是一个文件,因此dir/
不应该匹配它。我只是在本地测试它,事实上,它不符合预期。我使用的是Git v2.10.0。它写在那里@LukAron,“…”没有前缀,规则不仅适用于特定目录,也适用于子目录。如果您的.gitignore
中有dir
,它将匹配名为dir
的文件、目录和符号链接,这些文件、目录和符号链接位于.gitignore
所在的任何嵌套目录中。下面接受的答案错误地指出/dir/和/dir/*是等效的。请看维克多的回答: