Use when setting up or installing the automated GitLab git workflow in a project, including branch versioning, monthly tags, auto-merge to develop, and branch cleanup.
65
82%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Passed
No known issues
#!/bin/bash
# =============================================================================
# post-commit hook
# 触发时机:开发者在 V{x.y.z}_base_{username} 分支上执行 git commit 后自动触发
# 作用:
# 1. 创建子版本分支 V{x.y.z}.{n}_username
# 2. 推送子版本分支到远端
# 3. 通过 git worktree 自动合并到 develop(不切换当前工作分支)
# =============================================================================
set -e
# ── 1. 检查当前分支是否为 base 分支 ──────────────────────────────────────────
CURRENT_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null || echo "")
if [[ ! "$CURRENT_BRANCH" =~ ^(V[0-9]+\.[0-9]+\.[0-9]+)_base_(.+)$ ]]; then
# 不是 base 分支,跳过
exit 0
fi
VERSION="${BASH_REMATCH[1]}" # e.g. V2.0.0
USERNAME="${BASH_REMATCH[2]}" # e.g. liwanchun
echo "[gitflow] 检测到 base 分支提交:$CURRENT_BRANCH"
# ── 2. 从远端 tag 查询该用户在此大版本下的最新子版本号 ──────────────────────
# tag 格式:V2.0.0.3_liwanchun
# 转义版本号中的点,用于正则匹配
ESCAPED_VERSION="${VERSION//./\\.}"
LATEST_N=$(git ls-remote --tags origin \
| grep -oE "refs/tags/${ESCAPED_VERSION}\.[0-9]+_${USERNAME}$" \
| grep -oE '\.[0-9]+_' \
| grep -oE '[0-9]+' \
| sort -n \
| tail -1)
if [ -z "$LATEST_N" ]; then
NEXT_N=0
else
NEXT_N=$((LATEST_N + 1))
fi
NEW_BRANCH="${VERSION}.${NEXT_N}_${USERNAME}"
echo "[gitflow] 新子版本分支:$NEW_BRANCH"
# ── 3. 在当前 HEAD 创建子版本分支并推送 ────────────────────────────────────
git branch "$NEW_BRANCH"
git push origin "$NEW_BRANCH"
echo "[gitflow] 已推送分支:$NEW_BRANCH"
# ── 4. 通过 worktree 合并到 develop(不切换当前工作目录)─────────────────────
REPO_ROOT=$(git rev-parse --show-toplevel)
WORKTREE_DIR="${REPO_ROOT}/.gitflow-worktree-develop"
# 清理可能残留的 worktree
if [ -d "$WORKTREE_DIR" ]; then
git worktree remove "$WORKTREE_DIR" --force 2>/dev/null || rm -rf "$WORKTREE_DIR"
fi
# 拉取最新 develop
git fetch origin develop
# 添加 worktree
git worktree add "$WORKTREE_DIR" origin/develop -b develop-gitflow-tmp 2>/dev/null \
|| git worktree add "$WORKTREE_DIR" develop
(
cd "$WORKTREE_DIR"
# 确保是最新 develop
git pull origin develop --ff-only 2>/dev/null || true
# 合并子版本分支(no-ff 保留合并记录)
git merge --no-ff "origin/$NEW_BRANCH" -m "Auto-merge $NEW_BRANCH to develop"
git push origin develop
)
# 清理 worktree
git worktree remove "$WORKTREE_DIR" --force 2>/dev/null || true
git branch -D develop-gitflow-tmp 2>/dev/null || true
echo "[gitflow] 已合并 $NEW_BRANCH → develop ✓"