本文目录导读:

Git 钩子脚本的应用场景非常广泛,从代码质量保障到工作流自动化都有涉及,以下是 Git 钩子脚本的主要应用场景,按钩子触发的阶段分类:
客户端钩子
提交工作流钩子(pre-commit、prepare-commit-msg、commit-msg)
- 代码规范检查:运行 ESLint、Prettier、StyleLint 等检查代码格式
- 静态代码分析:运行 SonarQube、Checkstyle 等工具
- 单元测试:执行相关测试用例确保代码不破坏已有功能
- 安全检查:检测硬编码的密码、API 密钥等敏感信息
- 文件大小检查:阻止提交过大的文件
- 提交信息模板:自动填充或格式化提交信息
- 提交信息规范检查:验证是否符合 Conventional Commits 规范
推送前钩子(pre-push)
- 运行集成测试:推送前执行完整的测试套件
- 代码覆盖率验证:确保覆盖率不低于阈值
- 分支命名检查:验证分支名是否符合规范(如 feature/xxx、bugfix/xxx)
- 编译构建验证:确保代码能成功构建
- 合并冲突检查:检查是否有未解决的冲突
其他客户端钩子
- post-commit:触发 CI/CD 构建、更新 JIRA 状态、发送 Slack 通知
- post-checkout:切换分支后自动安装依赖、更新子模块
- pre-rebase:检查分支是否已推送、是否有未保存的更改
服务器端钩子
推送接收钩子(pre-receive、update、post-receive)
- 权限控制:限制哪些用户/分支可以推送
- 文件完整性检查:验证 Git LFS 文件完整性
- 分支保护:禁止强制推送到保护分支
- 合并策略强制:禁止非 fast-forward 合并
- 自动部署:推送到特定分支后自动部署到开发/测试环境
- 代码审查:确保所有提交都有对应的 Code Review
综合应用场景
自动化工作流
- JIRA/GitHub Issues 集成:从提交信息中提取 ticket 号,自动更新状态
- Git Hooks + CI/CD:结合 Jenkins、GitLab CI 等工具实现完整的自动化流水线
- 依赖管理:提交后自动更新 package-lock.json 或 requirements.txt
- 版本号管理:提交后自动升级版本号并打 tag
团队协作
- 规范统一:通过钩子强制团队统一代码风格、提交信息格式
- 知识管理:自动生成 CHANGELOG 文档
- 工作流监控:记录开发操作日志,生成周报
实际示例
# 一个典型的 pre-commit 钩子脚本流程 1. 保存当前工作区状态 2. 运行代码格式化(prettier) 3. 运行静态检查(eslint) 4. 运行单元测试(jest --staged-files) 5. 检查敏感信息泄露 6. 如果以上都通过,允许提交
# pre-push 钩子示例 1. 获取所有即将推送的引用 2. 对每个推送的提交运行集成测试 3. 检查分支命名规范 4. 验证主分支是否包含最新的代码 5. 如果验证失败,阻止推送
注意事项
- 性能影响:钩子会减慢开发流程,应避免执行耗时长、资源消耗大的操作
- 绕过机制:git commit --no-verify 可绕过钩子,不应过度依赖
- 跨平台兼容:确保钩子脚本在 Windows、macOS、Linux 上都能运行
- 维护成本:团队共享的钩子需要统一管理和版本控制
推荐实践
- 使用 Husky(JavaScript)或 lefthook(Go)等工具管理客户端钩子
- 将钩子配置文件存放在仓库中,团队成员自动同步
- 在前置钩子(pre-)中做检查,后续钩子(post-)中做通知
- 钩子脚本应快速失败,提供清晰的错误信息
通过合理使用 Git 钩子,可以显著提升团队的代码质量和开发效率,实现标准化、自动化的开发工作流。