#3538·ripgrep

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_parents63 个方面与 git 不一致,而且所有 63 个都是同一个形状和方向 - git 将其忽略,而 crate 则不会。它们是平文 matched 在同一个语料库中错误的 1,976 个的严格子集,因此父目录遍历从来不会 更差,它只是不涵盖此问题。遍历不会受到影响,如最后一列所示。

内容来源: BurntSushi/ripgrep