Git Hooks 简介
Git 不仅仅是一个版本控制系统。它还提供自动化功能来提高开发人员的工作效率。其中一项功能就是Git Hooks。

Git Hooks 是 Git 在特定事件(例如 提交代码 、 推送到 远程存储库或 合并分支)之前或之后自动执行的 脚本。它们允许开发人员在 Git 工作流中无缝地自动执行任务。
简单来说,Git Hooks 就像在 Git 生命周期的不同阶段运行的“触发脚本”。
Git Hooks 的必要性
如果没有 Git Hooks,在整个团队中保持一致的标准可能会很困难。例如,可能会出现以下问题:
- 开发人员可能会忘记在提交之前运行 linting 或测试。
- API 密钥或凭证等敏感文件可能会被意外推送。
- 提交消息可能缺乏标准格式,使得历史记录更难阅读。
Git Hooks 通过 自动检查 和强制执行规则 解决了这些问题。Git Hooks 无需依赖开发人员记住每个步骤,而是通过 自动运行预定义的脚本 来确保质量和一致性。
可用的 Git Hooks 类型
Git 提供了多种 Hook,可用于工作流的不同阶段。这些 Hook 分为两类:
- 客户端钩子 :由诸如 提交 、 合并 或变基 等操作触发。例如:pre-commit、prepare-commit-msg、commit-msg。
- 服务端钩子:当收到推送时在服务端触发。例如:pre-receive、update、post-receive。
如何找到 Git Hooks
初始化 Git 仓库时,Hooks 会以示例脚本的形式保存在 .git/hooks/ 目录中。您可以使用以下命令进行验证:
ls .git/hooks/
您将看到诸如 pre-commit.sample、pre-push.sample 等文件。这些示例文件 默认不处于活动状态,您可以通过从文件名中删除.sample 扩展名来使它们处于活动状态。
Git Hook 的示例用法:使用 Linter 进行预提交
让我们逐步指导如何设置 预提交钩子,以便在暂存文件中 存在 linting 错误时阻止提交。
步骤 1:导航到 Hooks 目录
cd .git/hooks/
步骤 2:创建 / 编辑预提交钩子
nano pre-commit
步骤 3:添加 Hook 脚本
这是一个示例脚本,用于在允许提交之前检查 ESLint 问题:
#!/bin/sh
echo "Running lint checks..."
# Run ESLint on staged JavaScript files
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.js$')
if [ "$STAGED_FILES" = "" ]; then
exit 0
fi
# Run eslint
npx eslint $STAGED_FILES
if [ $? -ne 0 ]; then
echo "❌ Lint errors found. Commit aborted."
exit 1
fi
echo "✅ Lint checks passed!"
exit 0
步骤 4:使其可执行
chmod +x .git/hooks/pre-commit
步骤 5:测试钩子
- 修改存在 linting 问题的.js 文件。
- 尝试提交:
git add file.js
git commit -m "Test commit"
- 如果发现问题,提交将被阻止,直到您修复问题为止。这确保没有开发人员会提交带有 linting 错误的代码。
Git Hooks 的优点
- 自动化:自动执行重复性任务,如运行测试、检查或格式化。
- 一致性:在整个团队中强制执行代码质量和项目标准。
- 安全性:防止意外提交敏感文件或坏代码。
- 效率:在代码推送之前尽早发现问题,从而节省时间。
- 灵活性:可以根据不同的工作流程和工具定制钩子。
有了 Git Hooks,团队可以保持 更高的代码质量 、轻松 执行规则 并自动执行日常检查——所有这些都直接在 Git 的工作流程中完成。
就这样!这只是关于在日常工作流程中使用 Git Hooks 的快速概述。
可参考
- 官方 Git 文档:https://git-scm.com/docs/githooks