一句话理解
Hooks 是代码仓库的"自动触发器"——在特定操作(提交、推送、合并)发生时,自动执行预设脚本,把人工检查变成机器检查。
最常见的三种实战场景
| 钩子类型 | 触发时机 | 典型用途 |
|---------|---------|---------|
| pre-commit | 执行 git commit 前 | 代码格式化(Prettier)、Lint 检查、敏感信息扫描 |
| pre-push | 执行 git push 前 | 跑单元测试、检查构建是否通过 |
| post-merge | 完成 git merge 后 | 自动安装依赖(npm install)、刷新本地配置 |
最小可行示例(前端项目)
在项目根目录创建 .git/hooks/pre-commit(无后缀名):
#!/bin/sh
# 阻止提交 console.log 未删除的代码
if grep -r "console.log" src/ --include="*.js" --include="*.ts"; then
echo "❌ 发现 console.log,请先清理"
exit 1
fi
# 自动格式化
npx prettier --write .
git add -A
赋予执行权限:chmod +x .git/hooks/pre-commit
团队协作的坑与解
坑 1:.git/hooks 目录不会同步到远程仓库,新人clone下来没有钩子
解:使用 Husky(前端)或 Git LFS 的钩子管理,将钩子脚本放在项目目录(如 ./hooks),在 package.json 中配置:
{
"husky": {
"hooks": {
"pre-commit": "npm run lint && npm test"
}
}
}
坑 2:钩子脚本里放耗时操作(如跑全量 E2E 测试)
解:只放轻量检查(< 10秒),重任务放到 CI/CD 流水线,别阻塞开发节奏。
坑 3:Windows 和 Mac 的脚本语法差异
解:用 Node.js 写钩子逻辑(#!/usr/bin/env node),跨平台兼容。
什么时候别用 Hooks
- 需要多人强制统一的规范 → 用 CI 拦截,别靠本地钩子(可以被跳过
git commit --no-verify) - 涉及密钥、部署等敏感操作 → 放服务端钩子(GitLab/GitHub Webhooks),本地脚本容易被篡改
总结
Hooks 是"最后一公里"的代码守门员,适合做快速、本地、必做的检查。记住口诀:轻量、本地、可绕过,重活交给服务器。