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 中执行。