pre-commit钩子未触发的首要原因是husky未真正启用,需执行npx husky install创建.husky目录并设置core.hookspath为.husky,同时确保package.json含"prepare": "husky install"且.pre-commit文件有可执行权限。

pre-commit 钩子没触发?检查 husky install 是否执行成功
很多情况下 git commit 依然直接通过,根本没跑 ESLint 或 Prettier,问题大概率出在 Husky 没真正启用。Husky 不是装完就生效的,必须显式运行初始化命令。
-
npx husky install必须在项目根目录执行,它会创建.husky/目录并设置 Git 的core.hooksPath - 执行后可验证:
git config core.hooksPath应输出.husky - 如果用的是 pnpm,注意
npx可能调不到本地node_modules/.bin下的 husky,建议改用pnpm exec husky install - 某些 CI 环境或 Docker 容器里 Git 配置被重置,
core.hooksPath会被清空,需在构建脚本中补上git config core.hooksPath .husky
lint-staged 执行报错“command not found”?路径和 shell 环境不一致
你在终端里能跑 eslint --fix,但 git commit 时却提示找不到命令——这是 Husky 在 Git 自带的最小 shell(通常是 dash 或 sh)下执行脚本,不是你日常用的 bash/zsh。
- 不要写
"eslint --fix",改用"npx eslint --fix"或"npm exec eslint --fix",确保命令可跨 shell 解析 - 如果用了
pnpm,对应写成"pnpm exec eslint --fix" -
lint-staged配置里避免绝对路径或依赖 shell 特性(比如&&、$()),它默认用sh -c执行每条命令 - 可在
.husky/pre-commit文件开头加#!/usr/bin/env bash强制指定解释器,但不如统一用npx兼容性好
VSCode 提交按钮点了却没触发校验?别依赖 GUI 提交
VSCode 内置的源代码管理面板点“✓”提交,本质上仍是调用 git commit 命令,但部分旧版 VSCode 或插件(如 GitLens)可能绕过 Git hooks,尤其当你启用了“Skip pre-commit hooks”类选项时。
- 确认 VSCode 设置里没开启
git.enableSmartCommit以外的干扰项;更稳妥的做法是:一律用终端执行git commit -m "xxx" - 检查 VSCode 的
settings.json是否含"git.postCommitCommand": null或类似覆盖行为 - 如果团队用 GitHub Pull Requests 扩展,它的提交流程有时跳过本地 hooks,建议只用原生 Git 面板或终端
- 想验证是否真生效?故意写个 ESLint 报错(比如多一个
console.log),然后终端提交——失败才是正常
为什么改了代码却没被 lint-staged 处理?暂存区文件匹配逻辑要盯紧
lint-staged 只处理 git add 进暂存区的文件,不是你编辑过的所有文件。很多人以为保存即生效,其实不然。
- 配置中的 glob 模式(如
"*.{js,ts}")必须和实际暂存文件扩展名完全匹配,.jsx和.tsx需显式列出 - 新增文件未
git add就直接git commit -a,lint-staged默认不处理,除非你在配置里加--allow-empty或改用git add -A && git commit - 修改了
.prettierrc但没git add它,lint-staged不会重新格式化其他文件——它只管“当前暂存的文件”,不管配置变更 - 若用
git commit -m "xxx" --no-verify绕过,VSCode GUI 里也有对应勾选项(叫 “Skip pre-commit hooks”),务必关掉
git commit,不拦 git push;而团队 CI 通常在 push 后才跑完整测试。所以本地过不了 pre-commit ≠ CI 一定能过——ESLint 规则、TypeScript 版本、Node.js 环境这些,都得和 CI 严格对齐。











