search.exclude必须用合法glob格式(如"**/node_modules": true)才生效,否则静默失效;它不读.gitignore或files.exclude,仅认该字段,且需重载窗口刷新索引。

search.exclude 必须写对 glob 格式,否则静默失效
VSCode 的全局搜索(Ctrl+Shift+F)不会自动读 .gitignore,也不会继承 files.exclude;它只认 search.exclude 字段,且必须是合法的 glob 模式对象。配错格式不会报错,而是整条规则被丢弃——你搜出来的“不该出现的文件”,大概率就是这条规则根本没生效。
关键约束有三个:
-
键必须是 glob 字符串,几乎总要以**/开头(如"**/node_modules"),否则只匹配工作区根目录下的同名项 -
值必须是布尔值true,不能是字符串"true"或其他类型 - 路径分隔符必须用正斜杠
/,Windows 下写**\node_modules会被完全忽略
错误示例:"*.log": true(只扫当前目录)、".log": true(语法非法)、"node_modules": true(只排除根目录下那个)
正确写法:"**/*.log": true、"**/dist/**": true(加不加结尾 /** 效果一样,但语义更清晰)
临时排除比改配置更快,但优先级更高
打开搜索面板后,右上角点 ⋯ → «Files to exclude»,直接填 glob 规则,比如 **/tests/**,**/mocks/**,多个用英文逗号分隔、不能有空格。这个输入框的规则会覆盖 search.exclude,且关闭面板后自动清空。
典型使用场景:
- 想确认某个关键词是否只出现在
src/下,临时加**/tests/**,**/e2e/** - 调试时怀疑逻辑被
dist/里的旧代码干扰,填**/dist/** - 搜出不该出现的文件?第一反应就是点开这里看看有没有残留规则
search.exclude 和 files.exclude 是两套独立系统
search.exclude 只影响 Ctrl+Shift+F 的内容搜索结果;files.exclude 只控制资源管理器里哪些文件不显示、以及部分语言服务(如 TS 路径提示)的行为。两者互不影响。
常见误区:
- 只配了
files.exclude就以为搜索也跳过node_modules—— 实际上搜索仍会扫 - 把
search.exclude写进tsconfig.json或package.json—— VSCode 完全不读这些文件里的搜索配置 - 在用户级
settings.json里配了全局规则,但项目里.vscode/settings.json有冲突配置 —— 工作区设置优先级更高
推荐做法:项目级规则写进 .vscode/settings.json(可提交团队共用),通用规则(如所有项目都跳过 node_modules)写用户级设置。
改完配置不生效?不是配置错了,是缓存没刷新
VSCode 搜索依赖本地索引缓存,修改 search.exclude 后不会自动重建索引。尤其在大型项目中,旧索引可能持续返回已被排除路径下的文件。
解决办法只有两个:
- 按
Ctrl+Shift+P→ 输入Developer: Reload Window→ 回车(比完全重启快,且保留所有标签页) - 手动删掉
.vscode/.search文件夹(如果存在),强制重建索引
还有一个容易被忽略的点:某些 Git 插件或 Workspace Trust 设置为“受限”时,会绕过部分排除规则。如果重载窗口后仍无效,先检查插件和信任状态。











