prepare-commit-msg
1.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/bin/sh
# ============================================
# Prepare-commit-msg Hook
# ============================================
#
# 功能:
# 1. 自动更新 CHANGELOG.md(包含在当前提交中)
#
# 关键特性:
# - 只在初始提交时执行,amend 时不会触发
# - 配合 post-commit 使用 amend --no-verify 完成流程
#
# 作者:Claude Code
# 日期:2026-02-28
# ============================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 获取 commit message 文件
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2 # commit 来源:message/template/merge/squash等
# 只跳过 merge 提交,其他情况都执行
# 这样可以确保无论使用何种方式提交(-m/-C/-c等),CHANGELOG 都会被更新
if [ "$COMMIT_SOURCE" != "merge" ]; then
# 读取 commit message
if [ -f "$COMMIT_MSG_FILE" ]; then
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
# 只处理第一行(subject)
FIRST_LINE=$(echo "$COMMIT_MSG" | head -n 1)
# 解析 commit type
COMMIT_TYPE=$(echo "$FIRST_LINE" | sed -E 's/^([a-z]+)\(.*/\1/')
# 只对特定类型更新 CHANGELOG
# 跳过: docs(changelog) 类型的提交,避免循环
if echo "$FIRST_LINE" | grep -qE "^docs\(changelog\):"; then
# 跳过
:
elif [ "$COMMIT_TYPE" = "feat" ] || [ "$COMMIT_TYPE" = "fix" ] || [ "$COMMIT_TYPE" = "refactor" ] || [ "$COMMIT_TYPE" = "perf" ]; then
echo ""
echo "📝 ${BLUE}更新 CHANGELOG...${NC}"
# 调用 CHANGELOG 更新脚本
bash scripts/changelog/update-changelog-prepare.sh "$COMMIT_MSG_FILE"
fi
fi
fi