#!/usr/bin/env bash # ============================================================================= # Git 分支工作流辅助检查工具 (git-workflow-helper.sh) # 作用:校验分支合规性、协助功能子分支检出与阶段发布节点标记 # ============================================================================= set -eo pipefail COMMAND="$1" ARG="$2" CURRENT_BRANCH="$(git branch --show-current 2>/dev/null || echo '')" show_help() { cat < # 基于 dev 检出 feature/ 子分支 $0 fix # 基于 dev 检出 fix/ 子分支 $0 merge-to-dev # 将当前功能子分支测试后合回 dev $0 promote-to-test # 将 dev 合并到 test 并打候选版本 tag (如 rc-v1.1.0-beta.1) $0 release-to-main # 将 test 合并到 main 并打正式版本 tag (如 v1.1.0) EOF exit 1 } case "${COMMAND}" in check) echo "=== 当前 Git 分支与工作流检查 ===" echo "当前分支: [${CURRENT_BRANCH}]" echo "" case "${CURRENT_BRANCH}" in dev) echo "状态: 正处于【开发分支】。" echo "提示: 可直接在此分支进行小功能渐进式提交,或创建 feature/ 进行复杂功能开发。" ;; test) echo "状态: 正处于【测试分支】。" echo "提示: 仅用于长期实际部署和运维测试。新功能开发请切换至 dev。" ;; main) echo "状态: 正处于【主分支 (Release)】。" echo "警告: 严禁直接在 main 上开发代码!只有经过 test 验证的稳定节点才能合入 main。" ;; feature/*|fix/*) echo "状态: 正处于功能子分支 [${CURRENT_BRANCH}]。" echo "提示: 自测完成后,使用 '$0 merge-to-dev' 合回 dev 分支。" ;; *) echo "提示: 当前处于非常规分支 [${CURRENT_BRANCH}]。" ;; esac echo "" git status --short ;; feature) if [[ -z "${ARG}" ]]; then echo "错误: 请提供 feature 名称,例如: $0 feature session-cache" exit 1 fi echo "==> 从 dev 切换并创建 feature/${ARG}..." git checkout dev git pull --rebase origin dev 2>/dev/null || true git checkout -b "feature/${ARG}" echo "成功切换至 feature/${ARG}" ;; fix) if [[ -z "${ARG}" ]]; then echo "错误: 请提供 fix 名称,例如: $0 fix db-pool-leak" exit 1 fi echo "==> 从 dev 切换并创建 fix/${ARG}..." git checkout dev git pull --rebase origin dev 2>/dev/null || true git checkout -b "fix/${ARG}" echo "成功切换至 fix/${ARG}" ;; merge-to-dev) if [[ "${CURRENT_BRANCH}" != feature/* && "${CURRENT_BRANCH}" != fix/* ]]; then echo "错误: 当前分支为 ${CURRENT_BRANCH},不是 feature/* 或 fix/* 分支!" exit 1 fi SRC_BRANCH="${CURRENT_BRANCH}" echo "==> 准备将 ${SRC_BRANCH} 合并回 dev 分支..." git checkout dev git pull --rebase origin dev 2>/dev/null || true git merge --no-ff "${SRC_BRANCH}" -m "merge: 合并 ${SRC_BRANCH} 到开发分支 dev" echo "合并成功!可运行 'git branch -d ${SRC_BRANCH}' 删除已合入的本地临时分支。" ;; promote-to-test) TAG="${ARG}" if [[ -z "${TAG}" ]]; then echo "错误: 请提供测试候选 Tag 名称,例如: $0 promote-to-test rc-v1.0.0-beta.1" exit 1 fi echo "==> 切换至 test 分支并合并 dev 当前稳定节点..." git checkout test git pull --rebase origin test 2>/dev/null || true git merge --no-ff dev -m "release-candidate: 汇集 dev 功能至 test 分支,准备长期实测 [Tag: ${TAG}]" git tag -a "${TAG}" -m "实测候选版本: ${TAG}" echo "已成功合并至 test 并打上标签: ${TAG}!请启动 test 环境进行运维与功能测试。" ;; release-to-main) TAG="${ARG}" if [[ -z "${TAG}" ]]; then echo "错误: 请提供正式发布 Tag 名称,例如: $0 release-to-main v1.0.0" exit 1 fi echo "==> 切换至 main 分支并合并 test 验证节点..." git checkout main git pull --rebase origin main 2>/dev/null || true git merge --no-ff test -m "release: 经长期测试与运维验证通过,正式发布 ${TAG}" git tag -a "${TAG}" -m "正式发布版本: ${TAG}" echo "已成功合并至 main 并打上正式发布标签: ${TAG}!" ;; *) show_help ;; esac