如何在Git预提交钩子中获取提交信息?或寻替代钩子方案
如何在Git钩子中获取并校验提交信息
你遇到的问题很典型——pre-commit钩子确实没办法获取提交信息,因为它的触发时机是在你输入提交信息之前,此时Git还没生成提交信息的临时文件,自然拿不到相关内容,这也是你测试里看不到提交信息相关环境变量、参数为空的原因。
如果你要校验提交信息的格式,正确的钩子应该用commit-msg,它专门负责处理提交信息的校验,触发时机是在你输入完提交信息、Git即将完成提交的阶段,而且Git会自动把保存提交信息的临时文件路径作为第一个参数传给这个钩子脚本。
具体实现步骤
创建并配置commit-msg钩子
在你的项目.git/hooks目录下创建commit-msg文件(注意没有后缀),给它添加可执行权限:touch .git/hooks/commit-msg chmod +x .git/hooks/commit-msg编写校验脚本
把以下脚本写入commit-msg文件,你可以根据自己的需求修改校验规则:#!/usr/bin/env bash # 获取保存提交信息的临时文件路径 COMMIT_MSG_FILE="$1" # 读取提交信息内容 COMMIT_MSG=$(cat "$COMMIT_MSG_FILE") # 这里定义你的提交信息校验规则,示例是要求以指定类型开头(符合Conventional Commits规范) VALID_PATTERN="^(feat|fix|docs|refactor|test|chore): .+" # 执行校验 if ! [[ "$COMMIT_MSG" =~ $VALID_PATTERN ]]; then echo -e "\033[31m错误:提交信息格式不符合要求!\033[0m" echo -e "请遵循格式:\033[32m<类型>: <描述>\033[0m" echo "支持的类型:feat(新功能)、fix(修复BUG)、docs(文档修改)、refactor(重构)、test(测试)、chore(杂项)" exit 1 fi # 校验通过,允许提交 exit 0测试效果
当你执行git commit -m "不符合格式的信息"时,钩子会拦截提交并输出错误提示;如果用符合格式的信息比如git commit -m "feat: 添加用户登录接口",就能正常提交。
补充说明
如果你需要同时做代码层面的检查(比如代码格式、语法校验),可以保留pre-commit钩子处理这些逻辑,commit-msg钩子专门处理提交信息校验,两个钩子会按顺序触发,互不干扰。
内容的提问来源于stack exchange,提问作者user7898461
相关产品推荐
相关产品推荐

