pre-commit钩子未触发的根本原因是.husky/pre-commit文件缺失或不可执行;需运行npx husky install生成该文件,并确保其存在、有可执行权限(chmod +x),且项目根目录含.git目录。

pre-commit 钩子没触发?先看 .husky/pre-commit 是否存在且可执行
根本原因不是 VSCode 没配 Node,而是 Git Hook 本身没装好。.husky/pre-commit 文件必须真实存在、有可执行权限,且项目根目录下得有 .git 目录。
- 手动验证:运行
npx husky install,再检查.husky/pre-commit是否生成 - macOS/Linux 下若脚本报 “Permission denied”,立刻执行
chmod +x .husky/pre-commit - Windows 用户用 Git Bash 时,确保
.husky/pre-commit是 LF 换行(CRLF 会解析失败),可用 VSCode 底部状态栏切换 - pnpm 项目中,
npx lint-staged可能找不到本地二进制,需在.husky/pre-commit开头加一行:export PATH="./node_modules/.bin:$PATH"
lint-staged 匹配不到文件?检查 glob 路径和配置位置
常见现象是改了 .js 文件、git add 了,但 git commit 时完全没走 ESLint 或 Prettier —— 本质是 glob 模式没命中暂存文件。
- glob 始终以项目根为基准,不随你在哪个子目录执行
git commit改变 - 配置写在
package.json里时,字段名必须严格是"lint-staged"(全小写),拼成lintStaged或LintStaged就静默失效 - 若要处理
.vue或.tsx,glob 必须显式包含:"*.{js,ts,jsx,tsx,vue}",缺一个类型就跳过 - 配置文件优先级:项目根下的
lint-staged.config.js>.lintstagedrc>package.json中的lint-staged字段
格式化后文件没自动提交?关键在 lint-staged 的“闭环”是否完成
lint-staged 默认会在每个匹配任务成功执行后自动 git add,但这个动作极易被中断 —— 它不是“尽力而为”,而是强依赖任务退出码为 0。
- 比如配置
"*.js": ["eslint --fix"],某文件含语法错误导致eslint修复失败(非 0 退出),后续git add就不会触发 - 不要在配置里手动加
"git add"命令,重复写反而可能因顺序错乱导致部分文件漏加 - 验证是否生效:改一个
.js文件 →git add→git commit→ 提交完成后立刻git status,该文件应已从 “Changes to be committed” 区域消失 - 若仍残留,说明某任务中途失败,此时看控制台输出的最后一行命令退出码,或临时把命令改成
"eslint --fix && echo 'done'"确认执行流
VSCode 里点 Commit 按钮没反应?别怪编辑器,它只是调 git
VSCode 的提交按钮本质是执行 git commit 命令,所有逻辑都在 shell 层,和 VSCode 自身的 Node 环境、PATH 设置、插件开关都无关。
- 即使你没装 VSCode 的 ESLint 插件、没开
editor.formatOnSave,只要.husky/pre-commit正常,提交照样拦截 - 反之,如果终端里
git commit能触发校验,但 VSCode 里点按钮没反应,大概率是 VSCode 的 Git 集成卡在 UI 层(重启 VSCode 或重载窗口即可) - 真正容易被忽略的断点只有两个:
.husky/pre-commit脚本能稳定调起npx lint-staged,且lint-staged能准确识别暂存文件、执行修复、写入磁盘、再git add回暂存区 —— 缺一不可


















