- 约1238字
- 技术
- 2026年4月19日
每次commit前,你会不会也有这种经历?
代码改完了,信心满满地点击commit,结果刚推送出去,同事就跑来说:“你的代码格式不一样,lint报错了。“或者"测试用例怎么有一个没通过?”
你愣了一下:“我本地跑明明过了啊。“后来才发现,是自己忘了先跑lint,没跑测试。这种事发生一次两次还行,次数多了自己也不好意思。
我就是这么过来的。后来学了一招:用Git hooks配置自动检查,commit前自动跑lint和测试,不通过就不让提交。3行代码配置好,从此告别手动检查。
1. 先搞懂hooks是什么
Git hooks是Git提供的钩子脚本,在git命令执行前后自动运行。你可以理解为"触发器”——比如每次commit之前,Git会先问一声:“要执行pre-commit脚本吗?”
项目初始化后,hooks脚本藏在.git/hooks/目录下,里面有一堆示例文件,后缀是.sample。你把后缀去了,脚本就会生效。
今天要用的是pre-commit这个钩子——commit之前运行。
2. 3行代码配置自动检查
最基础的配置,3行就够:
# 1. 进入项目hooks目录
cd .git/hooks
# 2. 创建pre-commit脚本
cat > pre-commit << 'EOF'
#!/bin/sh
npm run lint
npm test
EOF
# 3. 加上执行权限
chmod +x pre-commit
解释一下:#!/bin/sh告诉系统用sh执行,npm run lint和npm test是你项目里本来就有的命令。这两个命令如果有一个返回非0状态码,commit就会被阻止。
3. 进阶:只检查改动的文件
上面那个配置会检查全部文件,项目大了会慢。进阶版只检查本次改动的文件:
#!/bin/sh
# 获取本次改动的文件
FILES=$(git diff --name-only --cached)
# 只对.js和.ts文件跑lint
for FILE in $FILES; do
if echo "$FILE" | grep -q '\.(js|ts)$'; then
npx eslint "$FILE"
fi
done
这样只有改动的文件会被检查,速度快很多。
4. 进阶2:跳过检查的场景
有时候确实需要绕过检查强制提交,比如要赶紧修复线上bug:
# commit时加--no-verify参数,跳过hooks
git commit --no-verify -m "quick fix"
但这个命令最好少用,建议配个专门的分支用于紧急修复,平时不用。
5. 进阶3:给团队统一配置
上面是项目级别的配置,换个项目就没了。团队统一配置需要把hooks放到项目目录:
# 1. 创建hooks目录
mkdir -p .githooks
# 2. 把脚本放进去
cat > .githooks/pre-commit << 'EOF'
#!/bin/sh
npm run lint
npm test
EOF
# 3. 告诉Git用这个目录
git config core.hooksPath .githooks
这一步要交给Git处理,需要在.git/hooks/目录删除pre-commit文件,以免冲突。
团队新成员入职时,只需要跑一遍初始化脚本,或者直接在项目readme里说明。
配好这个之后,我的commit流程变成了这样:改完代码,git add .,git commit -m "xxx",然后该跑的都自动跑了,没问题就提交成功,有问题就报错。
再也没出现过格式不过、测试不跑就提交的情况。
如果你也想试试,建议先从简单���lint检查开始,加上npm run test。等跑通了再加其他检查。
评论区聊聊,你们团队现在是怎么做提交前检查的?