谁搞清楚过 gitignore 里 xxx, xxx/, xxx/*, xxx/**的区别?

2017-06-03 09:50:12 +08:00
 r0ck3r

本身很晕,看了 SO 上有个问题的答案也没明白

3731 次点击
所在节点    git
7 条回复
zjsxwc
2017-06-03 09:56:03 +08:00
Chaos11
2017-06-03 09:57:53 +08:00
* `*` 匹配文件路径中的 0 个或多个字符,但不会匹配路径分隔符,除非路径分隔符出现在末尾
* `**` 匹配路径中的 0 个或多个目录及其子目录,需要单独出现,即它左右不能有其他东西了。如果出现在末尾,也能匹配文件。
clino
2017-06-03 10:24:59 +08:00
前面两个有 /的是特指目录吧?
1010011010
2017-06-03 11:07:09 +08:00
xxx/ 是不是 包含了 xxx/* 和 xxx/** ?
Biwood
2017-06-03 11:24:23 +08:00
我只知道 xxx 跟 xxx/*是不样的,我没猜错的话,前者会忽略整个文件夹,后者忽略了文件夹的内容但文件夹本身没忽略。

例如:
xxx
!xxx/aaa.txt
下面那段代码会失效

这样写就没有问题:
xxx/*
!xxx/aaa.txt
pright
2017-06-03 17:23:38 +08:00
单独一个 a 就是当作一个通配符匹配了,路径里面只要包含 a 就会被忽略。

a/ 是忽略 a 目录和目录下所有内容,我感觉它已经达到了忽略 a 目录下所有内容的目的了,所以后面再加*或者**都没区别了。
主要是类似 a/*/b 和 a/**/b 这种会有区别,前者只会忽略 a 和 b 中间只有一个目录的情况,后者则是任意目录层级(包括 a/b)都会忽略。
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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/365614

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX