Git Hooks

Git 钩子(Git Hooks)介绍

概述

Git 钩子是在 Git 仓库中特定事件发生时自动运行的脚本,分为客户端钩子服务器端钩子 。它们位于 .git/hooks 目录下,默认以 .sample 结尾的示例文件需要重命名(去掉 .sample)才能生效。

钩子类型

客户端钩子

1. 提交工作流钩子
  • pre-commit:在提交消息输入前运行,用于检查代码风格、运行测试等

    bash 复制代码
    # 示例:检查是否有调试语句
    if git diff --cached | grep -q "console.log"; then
      echo "发现 console.log 语句,请检查!"
      exit 1
    fi
  • prepare-commit-msg:在默认提交信息创建后、编辑器打开前运行

  • commit-msg:在用户输入提交信息后运行,用于验证提交信息格式

    bash 复制代码
    # 示例:要求提交信息符合规范
    if ! grep -qE "^(feat|fix|docs|style|refactor|test|chore): " "$1"; then
      echo "提交信息必须符合规范:<类型>: <描述>"
      exit 1
    fi
  • post-commit:在提交完成后运行,用于通知等操作

2. 电子邮件工作流钩子
  • 应用于 git am 命令的补丁应用流程
3. 其他客户端钩子
  • pre-rebase:变基前运行

  • post-merge:合并后运行

  • pre-push :推送到远程前运行

    bash 复制代码
    # 示例:推送前运行测试
    npm test
    if [ $? -ne 0 ]; then
      echo "测试失败,推送中止"
      exit 1
    fi

服务器端钩子

  • pre-receive:处理来自客户端的推送时最先运行
  • update:每个分支推送时运行
  • post-receive:推送完成后运行,可用于CI/CD、通知等

实际应用示例

1. 自动检查代码质量

bash 复制代码
#!/bin/bash
# .git/hooks/pre-commit

# 运行 ESLint
npx eslint --fix --ext .js,.jsx,.ts,.tsx src/

# 如果 ESLint 失败则阻止提交
if [ $? -ne 0 ]; then
  echo "ESLint 检查失败,请修复错误后再提交"
  exit 1
fi

2. 提交信息规范化

bash 复制代码
#!/bin/bash
# .git/hooks/commit-msg

# 检查提交信息格式
if ! grep -qE "^(feat|fix|docs|style|refactor|test|chore|perf|build|ci|revert)(\(.+\))?: .{1,50}" "$1"; then
  echo "错误:提交信息格式不正确!"
  echo "格式:<类型>(<范围>): <主题>"
  echo "类型:feat, fix, docs, style, refactor, test, chore等"
  echo "示例:feat(auth): 添加用户登录功能"
  exit 1
fi

3. 防止提交敏感信息

bash 复制代码
#!/bin/bash
# .git/hooks/pre-commit

# 检查是否包含敏感信息
if git diff --cached --name-only | xargs grep -n "password\|secret\|token"; then
  echo "发现可能包含敏感信息的文件,请检查!"
  exit 1
fi

管理钩子的最佳实践

1. 版本控制钩子

由于 .git/hooks 不在版本控制中,可以:

  • 在项目中创建 scripts/hooks 目录存放钩子
  • 使用符号链接或安装脚本
  • 使用 Husky(Node.js 项目)等工具管理

2. 使用 Husky(推荐用于 Node.js 项目)

bash 复制代码
# 安装
npm install 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

注意事项

  1. 性能影响:钩子中的操作应尽量快速
  2. 错误处理:非零退出码会中止操作
  3. 用户友好:提供清晰的错误信息
  4. 可跳过 :使用 git commit --no-verify 可跳过钩子检查

常见工具

  • Husky:现代化的 Git 钩子管理工具
  • lint-staged:只对暂存文件运行检查
  • commitlint:提交信息规范检查
  • pre-commit:Python 项目的钩子框架

Git 钩子是自动化开发工作流的重要工具,合理使用可以显著提升代码质量和团队协作效率。

相关推荐
小黑要努力13 小时前
智能音箱遇到的问题(一)
linux·运维·git
RePeaT13 小时前
【git】指令场景实战:单分支与多分支协作流程
git
前端Hardy15 小时前
杀疯了!Git 2.54 正式发布,3个封神新特性,效率直接翻倍!
git
Eloudy16 小时前
迁移带有 git lfs 功能的 github 仓库
git·github
xlq2232217 小时前
1.git
git
运维全栈笔记19 小时前
零基础掌握Jenkins CI/CD:Java项目自动构建与部署全流程指南
git·servlet·ci/cd·gitee·自动化·jenkins·devops
菜萝卜子20 小时前
【Git】GitLab 18.9 全局服务器钩子(Server Hooks)官方规范与落地实践
服务器·git·gitlab
用户114818678948421 小时前
Git Stash 丢失后的完整找回指南
前端·git
Ting.~21 小时前
GIT详解
java·笔记·git
克拉拉KLARA21 小时前
vscode禁用在git提交中插入ai coauthor copilot
git·vscode·copilot