#!/bin/bash # 设置默认版本号 (格式: 2.6.YYYYMMDDHH) DEFAULT_VERSION="2.7.$(date '+%Y%m%d%H')" # 获取参数 (起始tag) TARGET_TAG="$1" # 获取最后一个tag LAST_TAG=$(git describe --abbrev=0 --tags 2>/dev/null) # 确定版本范围 if [ -z "$TARGET_TAG" ]; then if [ -z "$LAST_TAG" ]; then echo "没有找到任何tag,将从头开始生成" RANGE="" else RANGE="$LAST_TAG..HEAD" fi else RANGE="$TARGET_TAG..HEAD" fi # 初始化临时文件 TEMP_FILE=$(mktemp) # 生成变更日志头 echo "## $DEFAULT_VERSION" > "$TEMP_FILE" echo >> "$TEMP_FILE" # 按类型分类提交记录 process_commits() { local type="$1" local header="$2" local pattern="$3" # 查找匹配类型的提交 git log $RANGE --no-merges --pretty=format:"%s | %an | %ad" --date=short | grep -E "$pattern" | while read -r line; do COMMIT_MSG=$(echo "$line" | cut -d'|' -f1 | sed 's/^ *//;s/ *$//') AUTHOR=$(echo "$line" | cut -d'|' -f2 | sed 's/^ *//;s/ *$//') DATE=$(echo "$line" | cut -d'|' -f3 | sed 's/^ *//;s/ *$//') # 如果是第一次找到该类型,先打印标题 if [ $printed_header -eq 0 ]; then echo "- $header" >> "$TEMP_FILE" printed_header=1 fi # 打印提交信息(移除类型前缀) CLEAN_MSG=$(echo "$COMMIT_MSG" | sed -E "s/^$type:\s*//i") echo " - $CLEAN_MSG [$AUTHOR]" >> "$TEMP_FILE" done } # 处理各类型提交(按优先级排序) printed_header=0; process_commits "feat" "feat: 新增功能" "^[fF]eat" printed_header=0; process_commits "fix" "fix: 问题修复" "^[fF]ix" printed_header=0; process_commits "" "other: 其他变更" "^((?![fF]eat|[fF]ix).)*$" # 合并到原文件 if [ -f changelog.md ]; then cat "$TEMP_FILE" changelog.md > changelog.md.tmp && mv changelog.md.tmp changelog.md rm "$TEMP_FILE" else mv "$TEMP_FILE" changelog.md fi echo "变更日志已更新到 changelog.md" echo "当前版本号: $DEFAULT_VERSION (请手动修改)"