本身很晕,看了 SO 上有个问题的答案也没明白
感觉*
跟**
没啥区别啊,测试目录树:
a/
├── a.txt
└── b/
└── b.txt
然后.gitignore
里用:
a/*
然后
> git add .
会忽略a/b/b.txt
,所以,即使是下层目录的文件,也没必要用**
啊
p.s. Double-star pattern in .gitignore
After checking fnmatch(3) desctiption and sources I assured that double-star pattern is unsupported by .gitignore. At least directly.
1
zjsxwc 2017-06-03 09:56:03 +08:00 1
|
2
Chaos11 2017-06-03 09:57:53 +08:00 1
* `*` 匹配文件路径中的 0 个或多个字符,但不会匹配路径分隔符,除非路径分隔符出现在末尾
* `**` 匹配路径中的 0 个或多个目录及其子目录,需要单独出现,即它左右不能有其他东西了。如果出现在末尾,也能匹配文件。 |
3
clino 2017-06-03 10:24:59 +08:00 via Android
前面两个有 /的是特指目录吧?
|
4
1010011010 2017-06-03 11:07:09 +08:00
xxx/ 是不是 包含了 xxx/* 和 xxx/** ?
|
5
Biwood 2017-06-03 11:24:23 +08:00 via Android
我只知道 xxx 跟 xxx/*是不样的,我没猜错的话,前者会忽略整个文件夹,后者忽略了文件夹的内容但文件夹本身没忽略。
例如: xxx !xxx/aaa.txt 下面那段代码会失效 这样写就没有问题: xxx/* !xxx/aaa.txt |
6
pright 2017-06-03 17:23:38 +08:00
单独一个 a 就是当作一个通配符匹配了,路径里面只要包含 a 就会被忽略。
a/ 是忽略 a 目录和目录下所有内容,我感觉它已经达到了忽略 a 目录下所有内容的目的了,所以后面再加*或者**都没区别了。 主要是类似 a/*/b 和 a/**/b 这种会有区别,前者只会忽略 a 和 b 中间只有一个目录的情况,后者则是任意目录层级(包括 a/b)都会忽略。 |
7
pright 2017-06-03 17:45:19 +08:00
不过 a/*和 a/**在配合!规则时会有点区别,以前被这个坑了几次。主要是因为 a/*其实只是忽略了 a 目录下的内容,a/**则是忽略了下面任意目录层级的内容。如果没有!规则,两者表现会是一样的,因为父目录被忽略,下面的所有内容都会被忽略。
下面这个例子可以用来说明 a/*和 a/**的区别: └── a ├── b │ ├── c │ └── d │ └── e └── d a/* !a/b/ !a/b/c 结果是 new file: a/b/c new file: a/b/d/e a/** !a/b/ !a/b/c 结果是 new file: a/b/c |