git项目的文件夹结构:
.git/
<some git stuff>
.gitignore
level1/
level2/
file1
file2
文件.gitignore
,file1
和file2
都是空的。
我运行git add .gitignore
和git 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
包含level1
,level1/
,level1/*
,level2
或level2/
,则会跟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/*
确实。
答案 0 :(得分:2)
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
工作的原因。