pre-commit钩子未运行的首要原因是钩子未正确注册或权限缺失,需检查.husky/pre-commit文件是否存在、是否可执行(chmod +x),并确认husky install已执行且.gitignore未忽略.husky目录。

pre-commit 钩子根本没运行
执行 git commit 后代码没被格式化,第一反应不该是调 Prettier 配置,而是确认钩子是否真在跑。很多项目装了 husky 和 lint-staged,但钩子压根没注册进 Git。
- 检查
.husky/pre-commit文件是否存在,且权限为可执行(chmod +x .husky/pre-commit);Windows 用户用 Git Bash 时极易漏这步 - 运行
git commit --allow-empty -m "test",如果没任何输出或报错,说明钩子没触发——husky install没执行,或.husky/目录被 gitignore 忽略了 -
package.json中的"husky": { "hooks": { "pre-commit": "lint-staged" } }是 husky v8+ 写法;v7 及以下需用"scripts": { "prepare": "husky install" }并手动npx husky add .husky/pre-commit "npx lint-staged"
lint-staged 只处理暂存区,但文件没被加进去
lint-staged 不扫整个项目,只处理 git add 过的文件。如果你改了代码但没 git add,或者用了 git commit -a,它就完全不介入。
- 确保
lint-staged配置里的 glob 模式匹配到目标文件,比如"*.{js,ts,jsx,tsx}"不会匹配.vue或.svelte;需要显式加上 - 命令里必须包含
git add,否则 Prettier 写完文件后仍处于“已修改未暂存”状态,提交会被中断:"prettier --write && git add" - VSCode 提交面板点「提交」时,底层走的是
git commit,但若你勾选了「跳过暂存」(Stage changes before committing),则lint-staged收不到任何文件
Prettier 格式化了但没生效,其实是 VSCode 没认领结果
钩子跑完了、Prettier 也写了文件,但你在 VSCode 里看不到变化?那是因为编辑器缓存了旧内容,它不会自动重载磁盘变更。
- VSCode 默认不监听外部修改,需开启
"files.autoSave": "onFocusChange"或手动按Ctrl+R刷新 - 更稳妥的做法是在
lint-staged命令末尾加&& echo "✅ Formatted",肉眼确认钩子确实执行了 - 如果格式化后文件内容没变(比如 Prettier 规则和当前代码已一致),VSCode 不会弹提示,容易误判为“失效”——建议临时改一行缩进再试
VSCode 提交面板绕过钩子的隐藏路径
VSCode 源代码管理视图的提交框本该触发 pre-commit,但某些场景下会失效。
- 第三方插件如 Git Graph、GitLens 的「Commit」按钮可能直连 Git API,跳过 shell 环境,导致钩子不执行
- GitHub Safe Sync 或企业版 GitHub Desktop 集成有时会拦截标准
git commit流程 - 最可靠验证方式:一律用终端执行
git add . && git commit -m "test",排除 UI 层干扰
git add 的显式调用——这两处断掉,整个链路就静默失败,连错误提示都不会有。


















