Gitignore递归匹配规则解析:为何*.c与d/*.c表现不同?
Git Ignore 路径匹配规则解析:为什么
*.c递归而d/*.c不递归? 核心匹配规则
Git Ignore的路径匹配逻辑,核心看模式里有没有包含路径分隔符/:
- 不带
/的模式:会递归匹配所有层级的文件/目录,不管路径嵌套多深 - 带
/的模式:仅匹配相对于.gitignore文件所在位置的指定层级路径,不会自动递归到更深的子目录
对应场景解释
- 模式
*.c:没有/,所以Git会在所有目录(当前目录、所有子目录、子子目录...)里查找.c文件,全部忽略 - 模式
d/*.c:包含/,这个模式的意思是「匹配当前目录下直接子文件夹d里的所有.c文件」,所以只会命中./d/*.c,不会匹配a/b/d/*.c这种嵌套在其他目录里的d文件夹内的文件
官方示例翻译与解读
例如,模式
doc/frotz/匹配doc/frotz目录,但不匹配a/doc/frotz目录;而frotz/匹配frotz目录以及a/frotz目录(所有路径均相对于.gitignore文件)。
这个示例的逻辑和上面的规则完全一致:
doc/frotz/:带/,是明确的相对路径,只匹配.gitignore所在目录下的doc/frotz目录,不会识别嵌套在a/里的doc/frotzfrotz/:不带开头的/,属于递归模式,会匹配所有层级下的frotz目录——不管是当前目录下的frotz,还是子目录a/里的frotz
补充:如何递归匹配所有d目录下的.c文件
如果想要忽略所有层级目录里d文件夹下的.c文件,需要用通配符**来表示任意层级的目录,也就是模式**/d/*.c。
内容的提问来源于stack exchange,提问作者qiu
相关产品推荐
相关产品推荐

