You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:27:14