Git 钩子
Git 钩子(Git Hooks)是 Git 提供的一种机制,允许在特定事件发生时自动执行自定义脚本。Git 钩子根据其触发时机分为客户端钩子和服务端钩子。客户端钩子通常在开发者的本地仓库中触发,而服务端钩子通常在远程仓库中触发。
常见的 Git 钩子类型
客户端钩子
pre-commit
: 在提交代码之前执行,可以用于检查代码格式或运行测试。commit-msg
: 在提交信息输入后执行,可以用于验证提交信息的格式。post-commit
: 在提交完成后执行,可以用于通知或日志记录。
服务端钩子
pre-receive
: 在服务器接收推送数据但更新引用前执行,可以用于拒绝不符合规范的推送。post-receive
: 在服务器接收推送数据并更新引用后执行,可以用于部署或通知。
应用场景
- 代码质量控制: 在
pre-commit
钩子中运行代码静态分析工具,以确保提交的代码符合质量标准。 - 提交信息规范: 在
commit-msg
钩子中检查提交信息格式,强制遵循一定的提交信息规范。 - 自动化部署: 在远程仓库的
post-receive
钩子中执行自动化部署脚本。 - 通知系统: 使用
post-commit
或post-receive
钩子在提交或推送后发送通知(如邮件、企微通知等)。
如何编写 Git 钩子
- 定位钩子目录: Git 钩子存放在仓库的
.git/hooks
目录中。可以在这个目录找到一些示例钩子文件(以.sample
结尾)。 - 创建钩子脚本: 在
.git/hooks
目录下创建一个新的钩子脚本文件,文件名与钩子事件对应。例如,创建pre-commit
钩子:
touch .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
- 编写钩子脚本: 编辑
pre-commit
文件,添加自定义脚本内容。例如,简单的pre-commit
钩子脚本可以如下:
#!/bin/sh
# 运行代码格式化工具,$? 是上一个命令的退出状态码,0 代表成功
npm run lint
if [ $? -ne 0 ]; then
echo "Linting failed, aborting commit."
exit 1
fi
# 运行测试
npm test
if [ $? -ne 0 ]; then
echo "Tests failed, aborting commit."
exit 1
fi
- 测试钩子: 在仓库中进行相关操作以触发钩子,确保钩子脚本按预期执行。
注意事项
- 钩子脚本默认不包含在仓库版本控制中,需要手动分发或使用工具(如 Husky)进行管理。
- 脚本必须具有执行权限。
- 钩子脚本可以用任何能够在系统上运行的语言编写,但常用的是 Shell 脚本。
通过合理使用 Git 钩子,可以在项目开发流程中自动执行多种任务,提高代码质量和开发效率。