Skip to content

Git 钩子(Hooks)是 Git 版本控制系统中的一种强大机制,允许开发者在特定 Git 事件(如提交、推送、合并等)发生时自动触发自定义脚本。这些脚本可以用于自动化任务、执行检查或强制项目规范。以下是关于 Git 钩子的详细介绍:


1. Git 钩子的基本概念

  • 位置:钩子脚本存储在 Git 仓库的 .git/hooks 目录中。
  • 类型:分为 客户端钩子(本地操作触发)和 服务端钩子(远程仓库操作触发)。
  • 语言:支持 Shell、Python、Ruby 等脚本语言,只需确保脚本可执行。
  • 触发时机:在特定 Git 生命周期事件(如提交前、推送后)自动执行。

2. 客户端钩子(Client-Side Hooks)

提交工作流相关

  1. pre-commit

    • 触发时机:执行 git commit 命令时,在输入提交信息前。
    • 典型用途
      • 检查代码风格(如 ESLint、Pylint)。
      • 阻止包含调试语句(如 console.log)的提交。
      • 运行自动化测试。
    • 终止提交:如果脚本以非零状态退出,提交会被中止。
  2. commit-msg

    • 触发时机:在提交信息被保存后,提交完成前。
    • 典型用途
    • 参数:接收一个包含提交信息文件的路径(如 .git/COMMIT_EDITMSG)。
  3. post-commit

    • 触发时机:提交完成后。
    • 典型用途
      • 发送通知(如邮件、Slack)。
      • 触发后续构建或部署流程。

合并与变基相关

  • pre-rebase:在 git rebase 前执行,可用于禁止对某些分支变基。
  • post-merge:在 git merge 成功后执行,常用于恢复依赖或清理临时文件。

推送相关

  1. pre-push
    • 触发时机git push 执行前,远程引用更新前。
    • 典型用途
      • 运行完整测试套件。
      • 检查推送的代码是否符合安全规则。
    • 参数:接收推送的目标远程名称和 URL。

3. 服务端钩子(Server-Side Hooks)

接收推送相关

  1. pre-receive

    • 触发时机:远程仓库收到 git push 时,在更新引用前。
    • 典型用途
      • 检查提交者的权限。
      • 强制代码审查流程(如必须通过 Pull Request)。
    • 终止推送:非零退出状态会拒绝所有推送的提交。
  2. update

    • 触发时机:与 pre-receive 类似,但针对每个分支分别触发。
    • 参数:接收分支名、旧提交 ID、新提交 ID。
  3. post-receive

    • 触发时机:推送完成后。
    • 典型用途
      • 触发持续集成(CI)或自动部署。
      • 更新问题跟踪系统状态。

4. 其他常用钩子

  • post-checkout:在 git checkoutgit clone 后触发,常用于切换依赖版本。
  • pre-applypatch:应用补丁前检查代码。
  • prepare-commit-msg:在提交信息编辑器打开前修改默认信息(如添加分支名)。

5. 配置与使用

创建钩子

  1. 进入 Git 仓库的 .git/hooks 目录。
  2. 创建与钩子同名的文件(如 pre-commit),删除 .sample 后缀(如果有)。
  3. 编写脚本并赋予执行权限:
    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 0

6. 实际应用场景

  • 代码质量:自动运行 Linter 或格式化工具(如 Prettier)。
  • 安全审查:检查敏感信息(如密码、密钥)是否被提交。
  • 工作流集成:同步任务状态到 JIRA/Trello。
  • 部署自动化:推送后触发生产环境部署。

7. 注意事项

  1. 版本控制:默认钩子不被 Git 跟踪。若需共享钩子,可将脚本存储在项目其他目录,通过符号链接或安装脚本复制到 .git/hooks
  2. 跳过钩子:使用 --no-verify 选项(如 git commit --no-verify)绕过钩子检查。
  3. 性能影响:避免在钩子中执行耗时操作(如完整测试),否则会拖慢本地操作。
  4. 运行路径:客户端钩子脚本的运行路径是在仓库根目录

总结

Git 钩子为开发者提供了高度定制化工作流的能力,通过自动化检查和任务,确保代码质量与流程规范。合理使用钩子可以显著提升团队协作效率,但需注意脚本的健壮性和执行效率。

/src/technology/dateblog/2025/05/20250523-git%20%E9%92%A9%E5%AD%90%EF%BC%88hooks%EF%BC%89%E4%BB%8B%E7%BB%8D%E5%8F%8A%E4%BD%BF%E7%94%A8.html