.stignore 通配符语法速查:星号、取反与路径锚定
模式语法一览
| 写法 | 匹配 | 示例 | |
|---|---|---|---|
| 普通文本 | 同名文件或目录(任意层级) | foo 匹配 foo、子目录里的 foo | |
* | 零或多个字符,不跨目录分隔符 | te*ne 匹配 telephone,不匹配 tele/phone | |
** | 同上,但跨目录分隔符 | te**ne 匹配 tele/sub/phone | |
? | 单个非分隔符字符 | te??st 匹配 tebest | |
[a-z] | 字符区间 | [0-9].jpg | |
{a,b} | 逗号分隔的备选集合 | {banana,pineapple} | |
\x | 转义特殊字符(Windows 上用 ` | `,见下) | \{banana\} 匹配字面 {banana} |
/foo | 仅匹配根目录下的 foo | 子目录里的 foo 不受影响 | |
!pat | 取反:匹配者不忽略 | 放行被宽规则挡住的例外 | |
// 开头 | 注释行 | // temp files |
两条铁律:
- 首条匹配生效:列表从上往下第一条命中的规则决定命运,后面的不再看;
- 路径都相对文件夹根:不存在绝对路径写法。
取反与扫描成本
! 放行放在宽规则之前。官方文档提醒:取反模式会迫使程序深入遍历被忽略的目录去找例外;而根锚定的取反(如 !/foo)没有这个代价。所以性能敏感的场景优先用根锚定写法:
!/重要目录
*
这样只有「重要目录」被扫描,其余一切忽略。
完整示例对照
官方文档给过一组经典对照(目录里有 foo、foofoo、bar2、My Pictures 等):
foo // 忽略名为 foo 的,foofoo 不受影响
*2 // 忽略一切以 2 结尾的
qu* // 忽略 qu 开头
!quuz // —— 写在 qu* 之后就没用了!首条匹配生效
(?i)my pictures
顺序错了取反就失效,这是新手最容易踩的坑。
Windows 转义的特殊性
Windows 路径分隔符是反斜杠,所以 v2.0 起在 Windows 上用竖线 | 转义(如 |{banana|});或者统一在文件首行写 #escape=\ 恢复反斜杠转义——后者让同一份规则文件跨平台通用。
写完规则想验证行为,直接在界面的 Ignore Patterns 编辑器里看实时匹配提示;更系统的元数据同步边界问题见[哪些东西会被同步(04-what-syncs.md)。