files.readonlyInclude是VSCode 1.80+唯一有效的只读配置项,需配合系统级只读权限(如chmod 444或Windows属性勾选)才能真正防止误改;它支持glob路径匹配、强制只读UI行为,但不改变系统权限,且必须关闭files.saveWithoutWatching并重载窗口才生效。

files.readonlyInclude 是唯一有效的配置项
VSCode 1.80+ 版本已彻底移除 files.readonly,任何在 settings.json 中写 "files.readonly": [...] 的尝试都无效且不报错。真正起作用的只有 files.readonlyInclude,它是一个对象,键为 glob 路径模式,值为 true。
常见错误现象:右下角没显示 “Read-only”,或仍能 Ctrl+S 成功——大概率是误用了旧字段,或路径没匹配上。
- 路径必须基于工作区根目录,比如项目根下有
src/core/auth.ts,就得写"**/src/core/auth.ts",不能用绝对路径 - 必须用双星号
**/开头,"src/core/auth.ts"或"*/core/auth.ts"都不生效 - 改完配置后,已打开的匹配文件标签页不会自动更新状态,必须关闭再重新打开
- 不支持正则,只认 minimatch 语法;
"**/core/**/*.{ts,js}"是合法写法
为什么显示 Read-only 却还能编辑或保存成功
VSCode 的只读提示只是“信号”,不是“锁”。它只影响 UI 行为(灰掉编辑区、禁用 Ctrl+S),但不阻止粘贴、输入、删除等操作——你依然可以改内容,只是点保存时才拦截。
更关键的是:files.saveWithoutWatching 默认为 true,它会让 VSCode 绕过只读检查直接尝试写入。如果此时文件系统权限又恰好允许写(比如没设 chmod 444 或 Windows 属性未勾选“只读”),保存就静默成功了。
- 验证是否真生效:关闭文件标签页 → 重新打开 → 按 Ctrl+S,必须弹出
Unable to write file 'xxx' (NoPermissions)才算到位 - 务必在工作区
.vscode/settings.json中显式设"files.saveWithoutWatching": false - 仅靠
files.readonlyInclude不足以防手滑,它只管“保存”,不管“写入”
系统级只读才是最终防线
编辑器层的限制可被绕过(如 File → Save As、插件自动格式化、Remote-SSH 下远程权限判断),而操作系统级只读是硬性拦截,无法跳过。
Windows 下:右键文件 → “属性” → 勾选“只读” → 点“应用” → 勾选“将更改应用于此文件夹、子文件夹和文件”
macOS/Linux 下:终端执行 chmod 444 /path/to/file.ts(注意是 444,不是 644)
- chmod 444 对目录无效,别对
node_modules整体设——会破坏 npm/yarn 安装逻辑 - Git 仓库中文件权限可能被
git checkout重置,需同步执行git config core.filemode false - 设完系统只读后,VSCode 会进入“强只读”状态:光标不可定位、无法输入、Ctrl+A + Del 也无效,右下角锁图标变实心
锁定 node_modules 或 .env 类文件的实操写法
这类文件最常被误改,但又不能全局禁写(比如 node_modules 需要包管理器写入)。用 files.readonlyInclude 按路径精准控制最稳妥。
推荐写入项目根目录下的 .vscode/settings.json:
"files.readonlyInclude": {
"**/node_modules/**": true,
"**/.env*": true,
"**/package-lock.json": true,
"**/yarn.lock": true,
"**/.git/config": true
}
-
"**/node_modules/**"匹配所有嵌套层级,"**/node_modules/*"会漏掉lodash/es/clone.js这类深层路径 -
"**/.env*"同时覆盖.env、.env.local、.env.production - 不要写进用户级设置,否则会跨项目误伤;必须用工作区设置
- 改完后必须执行
Ctrl+Shift+P→Developer: Reload Window或完全重启 VSCode
真正防住误改,从来不是靠一个开关,而是系统权限 + 编辑器配置 + 路径匹配三者对齐——漏掉任意一环,都可能在某个深夜 Ctrl+S 时酿成事故。


















