← glob · 文件路径的迷你匹配语言 / dotfile 规则与「排除」的三种写法 待审核 4 / 6
04 · dotfile 与 ignore

dotfile 规则与「排除」的三种写法

两个高频实战问题:为什么 * 匹配不到 .env** 不进 .git/?以及「我要全部 ts 文件,但排除测试和 node_modules」该怎么写?前者是 dot 规则,后者各家工具的 ignore / 否定语法各不相同——这页一次讲清。

1 · dot 规则:开头的 . 要显式对齐

glob 沿袭 Unix shell 的传统:文件名. 开头时被视作「隐藏」,通配符 * ? [...] 默认不去匹配它。准确说法是——某一. 开头,则 pattern 对应段也必须以字面的 . 开头才命中。这条规则在目录维度同样成立:** 不会自己走进 .git/.vscode/。多数实现(node-glob / minimatch 的 dot,本仓库实现的 { dot: true } 选项)提供一个开关放行——下面的 demo 直接把这个选项传给 matchGlob

对照看:**/*.json 在 dot=false 时漏掉 .vscode/settings.json** 不进 dot 目录);打开 dot 开关,或显式写 .vscode/*.json,它才回来。而 .gitignore.env 这种文件名本身以点开头的,要靠 .* 一类显式点 pattern 命中。

2 · 排除:三家工具,三种设计

「圈一批、再排除一些」是 glob 最常见的真实需求,但怎么表达「排除」三家完全不同:

**node-glob 为什么不学 gitignore 用 !?**因为 ! 在 shell 里另有含义(历史扩展),且「include 与 exclude 混在一个列表里、靠顺序决定胜负」可读性差。node-glob 把两者拆成 patternignore 两个清晰的入参;gitignore 则因为是「逐行声明、后行覆盖前行」的模型,! 的撤销语义反而自然。同一个符号在不同体系里意义截然不同,正是 glob「方言」的典型。