.gitignore文件夹/通配符的意外行为

4

git项目的文件夹结构:

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

文件 .gitignorefile1file2 都是空的。 我执行了 git add .gitignoregit commit -m "create empty .gitignore"
如果 .gitignore 是空的,那么使用 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 -A,然后执行git 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个回答

4
根据gitignore文档
1)如果模式以斜杠结尾,则只会与目录匹配。
2)如果模式不包含斜杠 /,Git将其视为shell glob模式,并针对相对于.gitignore文件位置的路径检查匹配(如果不是来自.gitignore文件,则相对于工作树的顶级)。
3)否则,Git将该模式视为适合fnmatch(3)使用FNM_PATHNAME标志的shell glob:模式中的通配符不会与路径名中的/匹配。例如,“Documentation / * .html”与“Documentation / git.html”匹配,但不与“Documentation / ppc / ppc.html”或“tools / perf / Documentation / perf.html”匹配。
模式level2 / *属于第三种情况。由于项目根目录中没有level2目录,因此git不会忽略level1 / level2 /中的文件。
这就是为什么**/level2/*有效,以及为什么level2/level2也有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接