Git 钩子(Hooks)是一种自动化机制,允许在 Git 操作(如提交、推送、合并等)前后执行自定义脚本。钩子可以用于代码质量检查、自动化部署、安全审计等场景,是团队协作和 DevOps 流程中的重要工具。
本章将介绍 Git 钩子的安装方法、常见的钩子类型,以及如何编写和使用钩子。
16.1 安装钩子
Git 钩子是 Git 仓库的一部分,存储在 .git/hooks/ 目录下。Git 默认会提供一些示例钩子文件(以 .sample 结尾),可以基于这些示例创建自定义钩子。
16.1.1 钩子示例
列出 .git/hooks/ 目录中的默认钩子:
ls .git/hooks/
示例输出:
applypatch-msg.sample commit-msg.sample pre-commit.samplepost-commit.sample pre-push.sample pre-rebase.sample
这些 .sample 文件是模板,去掉 .sample 扩展名后,即可使其生效。例如,启用 pre-commit 钩子:
mv .git/hooks/pre-commit.sample .git/hooks/pre-commitchmod +x .git/hooks/pre-commit
16.1.2 创建一个钩子
Git 钩子是普通的 Shell 脚本(也可以使用 Python、Perl 或其他语言)。例如,创建 pre-commit 钩子,在每次提交前检查代码格式:
vim .git/hooks/pre-commit
添加以下内容:
#!/bin/bashecho "运行 pre-commit 钩子"eslint src/ || exit 1
然后赋予可执行权限:
chmod +x .git/hooks/pre-commit
现在,每次 git commit 时,Git 都会执行 pre-commit 钩子,若 ESLint 检测失败,则提交会被阻止。
16.2 可用的钩子
Git 提供了多种钩子,主要分为两类:
- 客户端钩子(作用于本地仓库)
- 服务器端钩子(作用于远程仓库)
16.2.1 与提交相关的钩子
| 钩子名称 | 触发时机 | 作用 |
|---|---|---|
pre-commit |
git commit 之前 |
检查代码质量,如 ESLint、Prettier |
prepare-commit-msg |
生成提交消息之前 | 修改提交信息,例如自动添加 JIRA 号 |
commit-msg |
git commit 之后 |
校验提交信息格式 |
post-commit |
提交完成后 | 发送通知,如 Slack/Email |
示例:commit-msg 强制要求提交信息包含 #issue
vim .git/hooks/commit-msg
#!/bin/bashcommit_msg=$(cat "$1")if ! grep -qE "#[0-9]+" <<< "$commit_msg"; thenecho "提交信息必须包含 Issue 编号(如 #123)"exit 1fi
16.2.2 与补丁相关的钩子
| 钩子名称 | 触发时机 | 作用 |
|---|---|---|
applypatch-msg |
git am 之前 |
检查补丁信息 |
pre-applypatch |
git am 之前 |
代码检查 |
post-applypatch |
git am 之后 |
发送通知 |
16.2.3 与推送相关的钩子
| 钩子名称 | 触发时机 | 作用 |
|---|---|---|
pre-push |
git push 之前 |
运行测试,如 Jest/Pytest |
update |
远程仓库收到推送 | 代码审查 |
示例:pre-push 禁止推送 debug.log
vim .git/hooks/pre-push
#!/bin/bashif git diff --cached --name-only | grep "debug.log"; thenecho "禁止推送 debug.log 文件"exit 1fi
16.2.4 其他本地版本库的钩子
| 钩子名称 | 触发时机 | 作用 |
|---|---|---|
pre-rebase |
git rebase 之前 |
防止错误变基 |
post-checkout |
git checkout 后 |
自动安装依赖 |
post-merge |
git merge 后 |
重新安装依赖或清理文件 |
示例:post-merge 自动安装依赖
vim .git/hooks/post-merge
#!/bin/bashif [ -f package.json ]; thenecho "运行 npm install..."npm installfi
结论
本章介绍了 Git 钩子的作用、如何安装和创建钩子,以及不同类型的 Git 钩子。钩子是 Git 自动化的重要工具,可用于代码质量检查、自动化部署、版本控制策略执行等。
