人人都会AI编程

10.1 钩子(Hooks)自动化机制

更新时间:2026-06-28

一句话理解
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 是"最后一公里"的代码守门员,适合做快速、本地、必做的检查。记住口诀:轻量、本地、可绕过,重活交给服务器。