进阶与大仓实践69 条

Git 钩子总览

钩子在提交、推送、合并等关键时刻自动执行:客户端钩子(pre-commit、commit-msg、pre-push 等)与服务端钩子(pre-receive 等)用途不同。

Git 与协作速查开发更新于 2026-10-13

Git 钩子是什么

Git 钩子是仓库在提交、推送、接收推送等关键节点自动执行的脚本。按运行位置分为两类:客户端钩子在本机操作前后触发,服务端钩子在接受推送时触发。它们靠退出码起作用——返回非零就会中断当前操作,因此常被用来做格式检查、提交信息校验和推送前的快速测试。

基本信息

位置.git/hooks/(初始样例文件带 .sample 后缀)
启用去掉 .sample 后缀并赋予可执行权限
分发不进入版本库、不随克隆分发,需用 hooksPath 或工具方案统一
生效条件退出码非 0 会中断当前 Git 操作
分类客户端钩子与服务端钩子

典型使用场景

  • pre-commit 检查代码格式与敏感信息,避免问题进入本地历史
  • commit-msg 校验提交信息是否符合团队约定格式
  • pre-push 跑一遍快速测试,阻止明显失败的代码推送
  • 服务端 pre-receive 统一强制策略,不依赖每个人本机的配置
  • post-checkout 生成环境文件或提示当前分支的用途
  • 提交信息自动补开工单号,减少人工填写遗漏

常用钩子

钩子触发时机典型用途
pre-commit提交前格式检查、敏感信息扫描
commit-msg提交信息生成后提交信息规范校验
pre-push推送前快速测试、阻止不合规分支
pre-receive服务端接收推送时统一强制策略
post-checkout检出后生成环境文件、输出提示

启用步骤

启用步骤
ls .git/hooks/                                       # 查看自带样例,均以 .sample 结尾
mv .git/hooks/pre-commit.sample .git/hooks/pre-commit # 去掉后缀即启用
chmod +x .git/hooks/pre-commit                       # 必须有可执行权限
.git/hooks/pre-commit                                # 可先手工执行一次验证脚本
git config core.hooksPath .githooks                  # 可选:改用仓库内的钩子目录
钩子目录在 .git 内,不属于版本库内容,克隆出来的仓库没有你的钩子。团队统一使用要靠 core.hooksPath 指向仓库内目录,或借助工具化方案分发。
客户端钩子可以被 --no-verify 跳过,也容易被本地改动。凡是必须守住的红线,应放到服务端钩子或 CI 中执行。

易错点

  • 钩子放在 .git 下不受版本控制,团队需用 hooksPath 或工具方案分发,否则只有自己生效
  • 客户端钩子可被 --no-verify 跳过,把强约束只挂在本地等于没有约束
  • 钩子脚本缺少可执行权限时会静默跳过,表现为配了却没有反应
  • 服务端钩子执行失败会让推送被拒,提示信息写得不清楚会造成难以排查的困惑
  • pre-commit 里跑全量测试会显著拖慢提交节奏,反而促使团队绕开钩子

数据来源与参考

  • Git 官方文档:githooks
  • Pro Git 2nd Edition · 8.3 Git 钩子
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌