VSCode本身不触发Git Hooks,真正起作用的是.husky/pre-commit脚本是否被Git正确执行;常见断点包括husky未安装、脚本无执行权限、lint-staged未安装或配置缺失git add,以及VSCode的git.enableSmartCommit为true导致绕过钩子。

VSCode 本身不触发 Git Hooks,真正起作用的是 .husky/pre-commit 脚本是否被 Git 正确执行——只要它没跑起来,ESLint 就永远不会在提交前扫描。
pre-commit 钩子根本没运行的三个硬性原因
VSCode 点提交按钮秒过、终端里 git commit 却报错,说明钩子压根没被调用。常见断点就三个:
-
npx husky install没执行过,.husky/目录不存在 -
.husky/pre-commit文件存在但没可执行权限(macOS/Linux 必须chmod +x .husky/pre-commit) - 项目根目录没有
package.json,或lint-staged没装在devDependencies里,导致npx lint-staged找不到命令
lint-staged 配置里漏掉 git add 就等于白修
eslint --fix 和 prettier --write 默认只改工作区文件,不会自动重新暂存。修复后的代码如果没 git add,提交的仍是旧版本,CI 或队友拉下来照样报错。
- 正确写法示例:
"*.{js,ts}": ["eslint --fix", "prettier --write", "git add"] - 顺序不能颠倒:
git add必须放在最后;否则prettier改完还没加进暂存区,eslint可能又报新错 - 匹配模式要覆盖实际暂存文件类型,比如用了 TypeScript 就得加
ts,否则lint-staged根本不处理
VSCode 的 git.enableSmartCommit 会绕过所有钩子
这个设置默认为 true,会让 VSCode 把“未暂存的修改”直接塞进 commit,跳过 Git 原生的 pre-commit 流程。结果就是:终端里 git commit 能跑 ESLint,VSCode 点 ✔️ 却秒提成功。
- 打开 VSCode 设置(
Cmd+,或Ctrl+,) - 搜索
git.enableSmartCommit - 把它设为
false - 之后必须手动
git add再提交,才能确保钩子生效
eslint.autoFixOnSave 和 pre-commit 同时开会导致工作区与暂存区不一致
两者都改工作区文件,但时机和范围不同:autoFixOnSave 是每次保存全量扫当前文件,pre-commit 是只处理暂存区且带 --fix 的文件。同时开启容易出现“保存时修了一次,提交前又修一次”,git diff 显示一堆无关变更。
- 建议关掉
eslint.autoFixOnSave(全局或项目级) - 把格式化和修复逻辑完全交给
pre-commit+lint-staged统一管控 - 真正起作用的从来不是 VSCode 界面按钮,而是
.husky/pre-commit是否被 Git 加载、Node 环境是否可用、以及暂存区文件是否真的被lint-staged拿到——这些环节任何一个断掉,强制扫描就失效。


















