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.sample
post-commit.sample pre-push.sample pre-rebase.sample
这些 .sample
文件是模板,去掉 .sample
扩展名后,即可使其生效。例如,启用 pre-commit
钩子:
mv .git/hooks/pre-commit.sample .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
16.1.2 创建一个钩子
Git 钩子是普通的 Shell 脚本(也可以使用 Python、Perl 或其他语言)。例如,创建 pre-commit
钩子,在每次提交前检查代码格式:
vim .git/hooks/pre-commit
添加以下内容:
#!/bin/bash
echo "运行 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/bash
commit_msg=$(cat "$1")
if ! grep -qE "#[0-9]+" <<< "$commit_msg"; then
echo "提交信息必须包含 Issue 编号(如 #123)"
exit 1
fi
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/bash
if git diff --cached --name-only | grep "debug.log"; then
echo "禁止推送 debug.log 文件"
exit 1
fi
16.2.4 其他本地版本库的钩子
钩子名称 | 触发时机 | 作用 |
---|---|---|
pre-rebase |
git rebase 之前 |
防止错误变基 |
post-checkout |
git checkout 后 |
自动安装依赖 |
post-merge |
git merge 后 |
重新安装依赖或清理文件 |
示例:post-merge
自动安装依赖
vim .git/hooks/post-merge
#!/bin/bash
if [ -f package.json ]; then
echo "运行 npm install..."
npm install
fi
结论
本章介绍了 Git 钩子的作用、如何安装和创建钩子,以及不同类型的 Git 钩子。钩子是 Git 自动化的重要工具,可用于代码质量检查、自动化部署、版本控制策略执行等。