.gitignore目录/通配符意外行为

时间:2017-09-01 13:45:12

标签: git directory wildcard gitignore

git项目的文件夹结构:

.git/
    <some git stuff>
.gitignore
level1/
    level2/
        file1
        file2

文件.gitignorefile1file2都是空的。 我运行git add .gitignoregit commit -m "create empty .gitignore"

如果.gitignore是emtpy,git add -A后跟git status输出(正如预期的那样):

new file: level1/level2/file1
new file: level1/level2/file2

所以,我git reset开始测试.gitignore的更改结果(假设我在.gitignore的以下每个更改之间执行此操作)

如果.gitignore包含level1level1/level1/*level2level2/,则会跟git add -Agit status输出(如预期的那样):

modified: .gitignore

但是,如果.gitignore包含level2/*,则git add -A后跟git status个输出:

modified: .gitignore
new file: level1/level2/file1
new file: level1/level2/file2

为什么level2/*在这种情况下不会与level2/产生同样的效果?此外,虽然level2/* 做我想做的事,但**/level2/* 确实

1 个答案:

答案 0 :(得分:2)

根据gitignore documentation

  

1)如果模式以斜杠结尾,则只能找到与目录的匹配。

     

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

     

3)否则,Git将模式视为适合fnmatch(3)使用FNM_PATHNAME标志消耗的shell glob:模式中的通配符与路径名中的/不匹配。例如,&#34; Documentation / * .html&#34;匹配&#34; Documentation / git.html&#34;但不是&#34;文档/ ppc / ppc.html&#34;或&#34; tools / perf / Documentation / perf.html&#34;。

模式level2/*属于第三种情况。由于项目根目录中没有目录level2,因此git不会忽略level1/level2/中的文件。

**/level2/*确实有效的原因,以及level2/level2工作的原因。