pre-commit钩子必须放在.git/hooks/pre-commit路径且无后缀、有执行权限;需用git diff --cached精准过滤待提交的js/ts文件,配合npx eslint检查并确保失败时退出码为1。

可以在 .git/hooks/pre-commit 中写一个脚本,让 Git 在提交前自动运行 ESLint,发现错误就中断提交。
确保 ESLint 已正确安装并可执行
ESLint 必须在本地项目中安装(推荐 devDependencies),且能通过命令行调用。建议使用 npx eslint 方式,避免依赖全局安装:
- 运行
npm install eslint --save-dev或yarn add eslint --dev - 确认项目根目录下有
.eslintrc.js(或.eslintrc.json等)配置文件 - 测试命令
npx eslint src/*.js能正常输出结果
创建可执行的 pre-commit 钩子脚本
在项目根目录下,进入 .git/hooks/,新建或编辑 pre-commit 文件(无扩展名),内容如下:
#!/bin/sh # 检查暂存区中所有 JS/TS 文件 STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '.(js|jsx|ts|tsx)$') <p>if [ -n "$STAGED_FILES" ]; then echo "Running ESLint on staged files..."</p><h1>使用 npx 确保调用项目本地的 ESLint</h1><p>npx eslint --quiet $STAGED_FILES if [ $? -ne 0 ]; then echo "ESLint failed. Please fix errors before committing." exit 1 fi fi</p>
保存后赋予执行权限:chmod +x .git/hooks/pre-commit
增强实用性的小技巧
-
只检查暂存文件:用
git diff --cached精准获取将要提交的文件,不扫全量代码 -
--quiet 模式:避免 ESLint 输出冗余信息,只显示错误和警告(需配合 ESLint 配置中的
reportUnusedDisableDirectives等合理设置) -
支持 TypeScript:只要 ESLint 配置了
@typescript-eslint/parser和对应插件,上述正则匹配.ts/.tsx即可生效 -
跳过校验(临时):提交时加
--no-verify参数,如git commit --no-verify -m "xxx"
替代方案:用 Husky 管理钩子(更推荐)
手动维护 .git/hooks 文件易丢失(不纳入 Git)、难共享、不跨平台。Husky 是更健壮的选择:
- 运行
npm install husky --save-dev - 启用钩子:
npx husky install - 添加 pre-commit:
npx husky add .husky/pre-commit "npx eslint --quiet $(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|jsx|ts|tsx)$')" - Husky 会自动确保钩子在 clone 后可用,并兼容 Windows/macOS/Linux
不复杂但容易忽略的是:pre-commit 只拦截你 git add 过的文件,没暂存的修改不会被检查;另外,ESLint 报错必须是非零退出码,否则钩子无法感知失败。











