如何用Git Hook按指定模板校验团队Commit提交信息?
实现Git Commit Message校验的pre-commit Hook
核心需求梳理
- 强制commit message符合指定模板(类型限定为fix、feat、refactor、style、BREAKING CHANGE)
- 若footer包含
(template-ignore),跳过校验 - 分支合并自动生成的commit message直接通过校验
Hook脚本实现
在项目的.git/hooks/目录下创建pre-commit文件(无后缀),写入以下脚本:
#!/bin/sh # 获取当前commit message文件内容 COMMIT_MSG_FILE="$1" COMMIT_MSG=$(cat "$COMMIT_MSG_FILE") # 放行分支合并自动生成的提交信息 if echo "$COMMIT_MSG" | grep -qE '^Merge branch|^Merge pull request'; then exit 0 fi # 若包含(template-ignore)标记,直接放行 if echo "$COMMIT_MSG" | grep -q '(template-ignore)'; then exit 0 fi # 定义允许的commit类型 ALLOWED_TYPES="fix|feat|refactor|style|BREAKING CHANGE" # 校验首行格式是否符合<type>: <description> if ! echo "$COMMIT_MSG" | grep -qE "^($ALLOWED_TYPES): .+"; then echo "ERROR: Commit message不符合规范!" echo "首行必须遵循格式:<类型>: <描述>" echo "允许的类型包括:fix, feat, refactor, style, BREAKING CHANGE" echo "若需跳过校验,可在footer添加(template-ignore)" exit 1 fi # 校验通过 exit 0
脚本配置说明
- 赋予执行权限:运行
chmod +x .git/hooks/pre-commit让脚本可执行 - 全局模板配合:你已配置的全局commit模板
git.exe config --global commit.template .git/.gitmessage可与该hook联动,自动带出模板格式,降低手动输入错误率 - 合并提交兼容:通过检测message开头的"Merge branch"或"Merge pull request"关键词,直接放行分支合并的自动提交信息
- 跳过校验机制:只要commit message的任意位置(footer)包含
(template-ignore),就会跳过所有格式校验
测试验证
- 合规提交:
git commit -m "feat: 添加用户登录功能",hook正常放行 - 不合规提交:
git commit -m "添加登录",hook报错拦截 - 分支合并:自动生成的合并message直接通过
- 带跳过标记提交:`git commit -m "临时修复: 紧急修复线上bug
(template-ignore)"`,hook正常放行
内容的提问来源于stack exchange,提问作者user19370621
相关产品推荐
相关产品推荐

