update.mode 必须设为 "none" 且关闭 windows 后台更新服务,macos 需禁用自动终止,linux snap 版需 hold 刷新,插件更新需同时禁用 autoupdate 和 autocheckupdates,settings.json 设只读防覆盖,并清理残留进程与计划任务。

update.mode 必须设为 "none",否则 VSCode 仍会下载安装包、弹窗提醒,甚至重启覆盖——这不是“不提示”,而是“不动作”的唯一可靠开关。
关主程序更新:只改 update.mode 不够,Windows 还得砍后台服务
VSCode 的主程序更新由两层机制驱动:配置控制的 UI 行为 + 系统级后台进程。光在设置里把 update.mode 改成 "none",只是让界面不弹窗,update.exe 进程仍可能每小时唤醒、静默拉取新版本包。
- 必须同时关闭
Update: Enable Windows Background Updates(GUI 设置中取消勾选),否则系统级更新服务绕过所有配置 - macOS 用户需额外运行:
defaults write com.microsoft.VSCode AppleAutomaticTermination -boolfalse,防止 macOS 守护进程自动唤醒更新流程 - Linux Snap 版用户必须执行:
sudo snap refresh --hold vscode,否则snapd每天强制刷新,VSCode 内部设置完全无效 - 改完后立刻验证:点击
Help → Check for Updates,应显示“当前已是最新版本”且菜单项变灰
关插件自动更新:两个布尔值缺一不可
extensions.autoUpdate 和 extensions.autoCheckUpdates 是独立开关,只关一个等于没关。前者管“装不装”,后者管“查不查”——关了 autoUpdate,插件仍会每小时发 HTTP 请求轮询新版本,弹气泡、占带宽、卡 Extension Host。
- 必须在
settings.json中显式写入:"extensions.autoUpdate": false和"extensions.autoCheckUpdates": false - GUI 设置有时不同步,尤其启用了 Settings Sync 或团队模板时,务必检查 JSON 文件是否真实生效
- 工作区
.vscode/settings.json优先级高于用户设置,若项目里写了"extensions.autoUpdate": true,你的全局设置会被直接覆盖 - GitLens、ESLint 等插件还会绕过通用开关,自行调用
vscode.window.showInformationMessage弹通知,需单独处理(如设gitlens.advanced.messages为空数组)
防配置被重写:settings.json 设只读比改 product.json 更靠谱
VSCode 大版本升级时,常会重写 %APPDATA%\Code\User\settings.json,把你手动加的 "update.mode": "none" 悄悄还原成 "default"。有人去改 product.json,但那是安装包内置文件,每次升级都会被覆盖,还可能触发校验失败。
- 正确做法是给
settings.json加只读权限:Windows 右键 → 属性 → 勾选“只读”;macOS/Linux 执行chmod 444 settings.json - 路径确认无误:
Windows:%APPDATA%\Code\User\settings.json
macOS:$HOME/Library/Application Support/Code/User/settings.json
Linux:$HOME/.config/Code/User/settings.json - 别信“点几下就搞定”,很多问题都出在配置看似生效、实则被覆盖
彻底断网兜底:清理残留进程和计划任务
即使所有配置都设为 false 和 "none",Windows 下的 update.exe 进程仍可能通过计划任务或注册表启动项复活,持续占用带宽、生成临时文件(如 vscode-update-stable-*.tmp)。
- 任务管理器中搜索
update.exe,结束所有相关进程 - 运行
taskschd.msc,在「Task Scheduler Library」中删除所有含VSCode或update的任务 - 注册表检查路径:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run,删掉值为Code.exe --no-sandbox --processStart "update.exe"的键 - Linux/macOS 下执行:
ps aux | grep update,确认无残留进程
Unable to parse GitLens state,才意识到昨晚它已经“自作主张”升级了。











