.gitignore中x、**/x、/**/x的语义与性能是否等价?
.gitignore三类匹配规则差异说明
1. x与**/x的等价性判断
1.1 语义逻辑维度
二者完全等价。
Git的glob匹配规则中,只要规则没有包含路径分隔符/,就会默认递归匹配仓库所有层级目录下的同名文件/目录,效果和主动加**/前缀完全一致。二者都会匹配仓库任意位置的名为x的文件或目录,没有匹配结果的差异。
1.2 匹配性能维度
二者不等价,x的匹配性能明显更好。
x是无通配符的简单字符串规则,Git做了专门的匹配优化,不需要解析路径层级就能快速判断**/x包含跨层级通配符**,Git需要遍历所有待检查路径的层级结构做通配匹配,仓库文件越多、目录层级越深,性能差距越明显
2. /**/x与前两者的核心差异
/**/x规则开头的/是根目录锚定标记,会把匹配范围锚定到.gitignore文件所在的仓库根目录,因此匹配逻辑和前两者有本质区别:
- 仅匹配仓库根目录下至少一级子目录中的
x,不会匹配根目录下直接存在的x - 其他层级子目录中的
x匹配结果和前两者一致
可以参考下面的目录结构匹配示例:
仓库根目录 ├── x # 被`x`、`**/x`匹配,不被`/**/x`匹配 ├── dir1 │ ├── x # 三个规则都可匹配 │ └── dir2 │ └── x # 三个规则都可匹配 └── dir3 └── x # 三个规则都可匹配
性能上/**/x因为锚定了根目录,匹配效率略高于无锚定的**/x,但仍然远低于简单规则x。
内容的提问来源于stack exchange,提问作者HappyFace
相关产品推荐
相关产品推荐

