如何在存在ESLint错误时阻止Git Push?(基于Husky+lint-staged)
问题修复方案
核心问题分析
你的配置存在两个关键问题:
- lint-staged 未针对暂存文件做ESLint检查:当前
npm run lint会扫描整个src目录,而非仅检查你暂存的变更文件,导致暂存的错误可能被忽略,完全没发挥lint-staged的作用。 - 检查时机滞后:仅在
pre-push阶段跑lint-staged,应该提前到pre-commit阶段,让开发者在提交代码时就发现错误,而非等到推送环节才拦截。
修复步骤
1. 修正 .lintstagedrc 配置
把全量ESLint调用改成针对暂存文件的检查,同时调整prettier和ESLint的执行顺序(先格式化再做lint检查):
{ "src/**/*.{js,jsx,ts,tsx,json,css,scss,md}": [ "prettier --write" ], "src/**/*.{js,jsx,ts,tsx}": [ "eslint --fix --max-warnings=0" ] }
- 移除了对
json文件的ESLint检查(ESLint默认不处理json格式,除非有专门插件) - 用
eslint --fix --max-warnings=0直接针对暂存文件做检查,自动修复可修复的错误,同时零警告容忍,任何错误都会直接中断流程
2. 添加 Husky pre-commit 钩子
在项目根目录执行以下命令,创建pre-commit钩子:
npx husky add .husky/pre-commit "npm run lint-staged"
这样你执行git commit时就会自动触发lint-staged,提前拦截错误,不用等到推送时才发现问题。
3. 优化 pre-push 钩子(可选)
如果希望推送前再做一次全量代码检查+测试,可以修改.husky/pre-push内容:
#!/bin/sh . "$(dirname "$0")/_/husky.sh" npm run lint && npm run test:prepush
这里用npm run lint做全量ESLint检查,确保整个代码库没有遗漏的错误,再执行测试流程。
4. 验证配置
- 故意在一个暂存的js/jsx文件中添加ESLint错误(比如重复导入)
- 执行
git commit,此时应该看到ESLint报错,提交操作被中断 - 修复错误后重新提交,流程可以正常执行
额外优化建议
- 可以调整
.eslintrc中的react/prop-types规则,当前设为1(警告级别),如果需要严格拦截可以改为2(错误级别) - 确认
package.json中的lint命令"eslint src --max-warnings=0"是正确的全量检查命令
内容的提问来源于stack exchange,提问作者Vladimir Kirichenko
相关产品推荐
相关产品推荐

