ignore: matched_path_or_any_parents 不会跳过排除的祖先,但文档注释并没有说明这一点
作者: KaizenShogun创建于 2026年9月16日更新于 2026年9月16日
matched_path_or_any_parents 只要路径与规则(包括白名单)完全匹配,就返回,并且只会向上遍历父目录,如果路径本身不匹配任何内容(gitignore.rs:234)。git 永远不会进入排除的目录,因此在一个规则下的否定不会带来任何结果。三个规则文件,git check-ignore --no-index(2.55.0)作为权威机构,路径是 API 所要求的方式(没有尾随斜杠,is_dir 单独传递):
| 规则 | 路径 | git | matched_path_or_any_parents |
matched |
rg --files 14.1.1 |
|---|---|---|---|---|---|
dist/ + !*.pub |
dist/keep.pub |
被忽略 | 未被忽略 | 未被忽略 | 未列出 ✓ |
.idea/ + !.idea/eclipseCodeFormatter.xml |
.idea/eclipseCodeFormatter.xml |
被忽略 | 未被忽略 | 未被忽略 | 未列出 ✓ |
__tmp/ + !__tmp/keep |
__tmp/keep |
被忽略 | 未被忽略 | 未被忽略 | 未列出 ✓ |
规模,因此它不是三个手工构建的树:从 43 个实际仓库的根目录 .gitignore 中提取的 9,852 个(规则文件,路径)查询,matched_path_or_any_parents 在 63 个方面与 git 不一致,而且所有 63 个都是同一个形状和方向 - git 将其忽略,而 crate 则不会。它们是平文 matched 在同一个语料库中错误的 1,976 个的严格子集,因此父目录遍历从来不会 更差,它只是不涵盖此问题。遍历不会受到影响,如最后一列所示。
内容来源: BurntSushi/ripgrep