Git Hooks
Git 钩子(Git Hooks)介绍
概述
Git 钩子是在 Git 仓库中特定事件发生时自动运行的脚本,分为客户端钩子和服务器端钩子。它们位于 .git/hooks 目录下,默认以 .sample 结尾的示例文件需要重命名(去掉 .sample)才能生效。
钩子类型
客户端钩子
1. 提交工作流钩子
- prepare-commit-msg:在默认提交信息创建后、编辑器打开前运行
- post-commit:在提交完成后运行,用于通知等操作
commit-msg:在用户输入提交信息后运行,用于验证提交信息格式
# 示例:要求提交信息符合规范if!grep -qE "^(feat|fix|docs|style|refactor|test|chore): ""$1";thenecho"提交信息必须符合规范:<类型>: <描述>"exit1fipre-commit:在提交消息输入前运行,用于检查代码风格、运行测试等
# 示例:检查是否有调试语句ifgitdiff --cached |grep -q "console.log";thenecho"发现 console.log 语句,请检查!"exit1fi2. 电子邮件工作流钩子
- 应用于
git am命令的补丁应用流程
3. 其他客户端钩子
- pre-rebase:变基前运行
- post-merge:合并后运行
pre-push:推送到远程前运行
# 示例:推送前运行测试npmtestif[$? -ne 0];thenecho"测试失败,推送中止"exit1fi服务器端钩子
- pre-receive:处理来自客户端的推送时最先运行
- update:每个分支推送时运行
- post-receive:推送完成后运行,可用于CI/CD、通知等
实际应用示例
1. 自动检查代码质量
#!/bin/bash# .git/hooks/pre-commit# 运行 ESLint npx eslint --fix --ext .js,.jsx,.ts,.tsx src/ # 如果 ESLint 失败则阻止提交if[$? -ne 0];thenecho"ESLint 检查失败,请修复错误后再提交"exit1fi2. 提交信息规范化
#!/bin/bash# .git/hooks/commit-msg# 检查提交信息格式if!grep -qE "^(feat|fix|docs|style|refactor|test|chore|perf|build|ci|revert)(\(.+\))?: .{1,50}""$1";thenecho"错误:提交信息格式不正确!"echo"格式:<类型>(<范围>): <主题>"echo"类型:feat, fix, docs, style, refactor, test, chore等"echo"示例:feat(auth): 添加用户登录功能"exit1fi3. 防止提交敏感信息
#!/bin/bash# .git/hooks/pre-commit# 检查是否包含敏感信息ifgitdiff --cached --name-only |xargsgrep -n "password\|secret\|token";thenecho"发现可能包含敏感信息的文件,请检查!"exit1fi管理钩子的最佳实践
1. 版本控制钩子
由于 .git/hooks 不在版本控制中,可以:
- 在项目中创建
scripts/hooks目录存放钩子 - 使用符号链接或安装脚本
- 使用 Husky(Node.js 项目)等工具管理
2. 使用 Husky(推荐用于 Node.js 项目)
# 安装npminstall husky --save-dev # 初始化 npx husky install# 添加钩子 npx husky add .husky/pre-commit "npm test" npx husky add .husky/commit-msg 'npx --no -- commitlint --edit "$1"'3. 跨平台兼容性
- 注意脚本的换行符(LF vs CRLF)
- 避免平台特定的命令
- 使用解释器声明(
#!/bin/bash)
注意事项
- 性能影响:钩子中的操作应尽量快速
- 错误处理:非零退出码会中止操作
- 用户友好:提供清晰的错误信息
- 可跳过:使用
git commit --no-verify可跳过钩子检查
常见工具
- Husky:现代化的 Git 钩子管理工具
- lint-staged:只对暂存文件运行检查
- commitlint:提交信息规范检查
- pre-commit:Python 项目的钩子框架
Git 钩子是自动化开发工作流的重要工具,合理使用可以显著提升代码质量和团队协作效率。