Git 钩子(Hooks)是 Git 版本控制系统中的一种强大机制,允许开发者在特定 Git 事件(如提交、推送、合并等)发生时自动触发自定义脚本。这些脚本可以用于自动化任务、执行检查或强制项目规范。以下是关于 Git 钩子的详细介绍:
1. Git 钩子的基本概念
- 位置:钩子脚本存储在 Git 仓库的
.git/hooks目录中。 - 类型:分为 客户端钩子(本地操作触发)和 服务端钩子(远程仓库操作触发)。
- 语言:支持 Shell、Python、Ruby 等脚本语言,只需确保脚本可执行。
- 触发时机:在特定 Git 生命周期事件(如提交前、推送后)自动执行。
2. 客户端钩子(Client-Side Hooks)
提交工作流相关
pre-commit- 触发时机:执行
git commit命令时,在输入提交信息前。 - 典型用途:
- 检查代码风格(如 ESLint、Pylint)。
- 阻止包含调试语句(如
console.log)的提交。 - 运行自动化测试。
- 终止提交:如果脚本以非零状态退出,提交会被中止。
- 触发时机:执行
commit-msg- 触发时机:在提交信息被保存后,提交完成前。
- 典型用途:
- 检查提交信息是否符合规范(如遵循 Conventional Commits)。
- 禁止空提交信息。
- 参数:接收一个包含提交信息文件的路径(如
.git/COMMIT_EDITMSG)。
post-commit- 触发时机:提交完成后。
- 典型用途:
- 发送通知(如邮件、Slack)。
- 触发后续构建或部署流程。
合并与变基相关
pre-rebase:在git rebase前执行,可用于禁止对某些分支变基。post-merge:在git merge成功后执行,常用于恢复依赖或清理临时文件。
推送相关
pre-push- 触发时机:
git push执行前,远程引用更新前。 - 典型用途:
- 运行完整测试套件。
- 检查推送的代码是否符合安全规则。
- 参数:接收推送的目标远程名称和 URL。
- 触发时机:
3. 服务端钩子(Server-Side Hooks)
接收推送相关
pre-receive- 触发时机:远程仓库收到
git push时,在更新引用前。 - 典型用途:
- 检查提交者的权限。
- 强制代码审查流程(如必须通过 Pull Request)。
- 终止推送:非零退出状态会拒绝所有推送的提交。
- 触发时机:远程仓库收到
update- 触发时机:与
pre-receive类似,但针对每个分支分别触发。 - 参数:接收分支名、旧提交 ID、新提交 ID。
- 触发时机:与
post-receive- 触发时机:推送完成后。
- 典型用途:
- 触发持续集成(CI)或自动部署。
- 更新问题跟踪系统状态。
4. 其他常用钩子
post-checkout:在git checkout或git clone后触发,常用于切换依赖版本。pre-applypatch:应用补丁前检查代码。prepare-commit-msg:在提交信息编辑器打开前修改默认信息(如添加分支名)。
5. 配置与使用
创建钩子
- 进入 Git 仓库的
.git/hooks目录。 - 创建与钩子同名的文件(如
pre-commit),删除.sample后缀(如果有)。 - 编写脚本并赋予执行权限:bash
chmod +x .git/hooks/pre-commit
示例:pre-commit 钩子
bash
#!/bin/sh
# 运行你的打包命令(例如:npm run build、mvn package 等)
echo "▶️ 正在执行前端打包命令..."
cd ui
pnpm run build
# 如果打包失败则终止提交
if [ $? -ne 0 ]; then
echo "❌ 打包失败,提交中止!"
exit 1
fi
# 将打包后的文件添加到本次提交(如果需要)
git add main/public/
echo "✅ 打包成功,继续提交..."
exit 06. 实际应用场景
- 代码质量:自动运行 Linter 或格式化工具(如 Prettier)。
- 安全审查:检查敏感信息(如密码、密钥)是否被提交。
- 工作流集成:同步任务状态到 JIRA/Trello。
- 部署自动化:推送后触发生产环境部署。
7. 注意事项
- 版本控制:默认钩子不被 Git 跟踪。若需共享钩子,可将脚本存储在项目其他目录,通过符号链接或安装脚本复制到
.git/hooks。 - 跳过钩子:使用
--no-verify选项(如git commit --no-verify)绕过钩子检查。 - 性能影响:避免在钩子中执行耗时操作(如完整测试),否则会拖慢本地操作。
- 运行路径:客户端钩子脚本的运行路径是在仓库根目录
总结
Git 钩子为开发者提供了高度定制化工作流的能力,通过自动化检查和任务,确保代码质量与流程规范。合理使用钩子可以显著提升团队协作效率,但需注意脚本的健壮性和执行效率。