如何在commit-msg钩子中正确执行两个if条件校验?
Commit消息校验脚本问题及修复
原始Commit-msg脚本
用于强制提交消息遵循格式规则的钩子脚本:
#!/bin/sh # 该钩子用于约束提交消息格式 # ANSI颜色代码,用于格式化输出 RED='\033[0;31m' NC='\033[0m' # 重置颜色 commit_msg="$1" error_msg="${RED}错误:提交消息必须以大写动词开头${NC}" error_length_msg="${RED}错误:提交消息长度必须超过20个字符${NC}" # 用正则校验消息是否以大写动词开头 if ! echo "$commit_msg" | grep -qE "^[A-Z][a-z]+"; then echo "$error_msg" >&2 exit 1 fi # 校验提交消息长度 if [ ${#commit_msg} -le 20 ]; then echo "$error_length_msg" exit 1 fi
测试异常表现
- 当提交消息以小写开头时,校验正常触发对应错误:
git commit -m "test capital letter" 错误:提交消息必须以大写动词开头 husky - pre-commit hook exited with code 1 (error)
- 但提交消息以大写开头但长度不足20字符时,错误提示仍指向“开头大写校验”,而非长度校验:
git commit -m "Test 20 letters" 错误:提交消息必须以大写动词开头 husky - pre-commit hook exited with code 1 (error)
关联的Pre-commit脚本
项目中配套的pre-commit脚本如下:
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" # 执行提交消息校验 .husky/commit-msg `$1` # 检查上一命令的退出状态 if [ $? -ne 0 ]; then exit 1 fi # 执行代码检查和lint-staged npx lint-staged # ANSI颜色代码,用于格式化输出 RED='\033[0;31m' NC='\033[0m' # 重置颜色 # 检查上一命令的退出状态 if [ $? -ne 0 ]; then echo "${RED}代码检查失败,终止提交。${NC}" exit 1 fi # 不打开launchpad运行Cypress组件测试 npm run cypress-run-component
修复后的Commit-msg脚本
根据建议修改了提交消息的读取方式:
#!/bin/sh # 该钩子用于约束提交消息格式 # ANSI颜色代码,用于格式化输出 RED='\033[0;31m' NC='\033[0m' # 重置颜色 commit_msg=`cat $1` # 此处修改:读取文件内容而非直接取参数 error_msg="${RED}错误:提交消息必须以大写动词开头${NC}" error_length_msg="${RED}错误:提交消息长度必须超过20个字符${NC}" # 用正则校验消息是否以大写动词开头 if ! echo "$commit_msg" | grep -qE "^[A-Z][a-z]+"; then echo "$error_msg" >&2 exit 1 fi # 校验提交消息长度 if [ ${#commit_msg} -le 20 ]; then echo "$error_length_msg" exit 1 fi
修复后测试结果
执行git commit -m "Test 20 letters"后,输出正确的错误提示:
错误:提交消息长度必须超过20个字符 husky - pre-commit hook exited with code 1 (error)
内容的提问来源于stack exchange,提问作者Ala Eddine Menai
相关产品推荐
相关产品推荐

