VSCode里pre-commit不执行,90%是Node环境未对齐:内置终端不加载shell配置导致node/npx不可见;需禁用git.enableSmartCommit、确保文件已git add、修复.husky/pre-commit权限与shebang、lint-staged配置末尾加git add、重启ESLint Server并验证三端一致性。

VSCode 里 pre-commit 不跑,90% 是 Node 环境没对上,不是配置写错了。 Husky 脚本在 Git 层执行,而 VSCode 内置终端默认不加载 shell 配置文件(比如 ~/.zshrc),node、npx 或 eslint 命令很可能根本找不到。
VSCode 提交按钮点了没反应?先查 git.enableSmartCommit
这是最隐蔽的“假失败”:VSCode 默认开启 git.enableSmartCommit,它会把未暂存的修改直接打包进 commit,跳过 Git 原生的 pre-commit 流程。结果就是终端里 git commit 能触发 lint,VSCode 点 ✔️ 却秒过。
- 必须在 VSCode 设置里搜
git.enableSmartCommit,设为 false - 改完后重启 VSCode 窗口(仅重载窗口不够)
- 确保你已
git add过要提交的文件——lint-staged只处理暂存区,不扫工作区
.husky/pre-commit 权限和 shebang 必须到位
Husky 生成的 .husky/pre-commit 是个 shell 脚本,macOS/Linux 下没有可执行权限就静默失败;Windows 虽不依赖权限,但缺少 #!/usr/bin/env bash 头部会导致某些环境解析异常。
- 运行
chmod +x .husky/pre-commit(macOS/Linux) - 打开
.husky/pre-commit,确认首行是#!/usr/bin/env bash - 别手动改脚本内容——用
npx husky add .husky/pre-commit "npx lint-staged"重生成
lint-staged 配置里漏掉 git add,修复就白做了
eslint --fix 和 prettier --write 默认只改磁盘文件,不会自动重新 git add。如果配置里没写 "git add",那格式化后的代码根本不在本次提交里,下次 git status 还能看到修改,CI 也会报错。
- 正确顺序:
"*.{js,ts}": ["eslint --fix", "prettier --write", "git add"] -
git add必须放在最后,否则prettier改完还没暂存,eslint可能又报新问题 - Vue 文件要单独加:
"*.vue": ["eslint --fix", "prettier --write", "git add"],*.{js,ts}不匹配.vue
VSCode 没读到新规则?重启或手动重启 ESLint Server
VSCode 的 ESLint 插件会缓存 .eslintrc.js,改完规则后不重启,编辑器里看到的仍是旧校验逻辑,但 husky 执行时却用新规则——造成“本地不报错,提交却卡住”的错觉。
- 改完
.eslintrc.js或.prettierrc后,必须运行命令:ESLint: Restart ESLint Server - 或者直接关闭并重新打开 VSCode 窗口(不是仅重载)
- 所有配置文件(
.eslintrc.js、.prettierrc、lint-staged字段)必须放在项目根目录,且已git add进仓库
真正卡住人的从来不是怎么写配置,而是 Node 路径、shell 环境、VSCode 缓存这三者之间没对齐。每次改完,都要验证:终端里 git commit 能否触发、VSCode 提交按钮是否真走钩子、修复后的文件是否进了暂存区——少一个环节,整条链就断了。


















