#!/bin/sh set -e MSG_FILE=$1 if [ ! -f "$MSG_FILE" ]; then printf '%s\n' '提交信息文件不存在。' >&2 exit 1 fi FIRST_LINE= SECOND_LINE= HAS_BODY= LINE_NO=0 while IFS= read -r LINE || [ -n "$LINE" ]; do case "$LINE" in \#*) continue ;; esac if [ -z "$FIRST_LINE" ]; then [ -n "$LINE" ] || continue FIRST_LINE=$LINE LINE_NO=1 continue fi LINE_NO=$((LINE_NO + 1)) case "$LINE_NO" in 2) SECOND_LINE=$LINE ;; *) if [ -n "$LINE" ]; then HAS_BODY=1 fi ;; esac done < "$MSG_FILE" case "$FIRST_LINE" in Merge*) exit 0 ;; esac if ! printf '%s\n' "$FIRST_LINE" | grep -Eq '^(feat|fix|refactor|docs|style|test|chore): .+$'; then cat >&2 <<'EOF' 提交信息格式错误。 格式: <类型>: <简短描述> 类型: feat / fix / refactor / docs / style / test / chore 示例: feat: 添加供应商批量管理功能 fix: 修复流式响应断连问题 chore: 版本升迁 v0.2.0 EOF exit 1 fi if [ ${#FIRST_LINE} -gt 72 ]; then printf '%s\n' '警告: 提交信息首行超过 72 个字符,建议保持简短。' >&2 fi if [ -n "$HAS_BODY" ] && [ -n "$SECOND_LINE" ]; then printf '%s\n' '提交信息首行后应为空行,再写详细描述。' >&2 exit 1 fi