CtrlK
BlogDocsLog inGet started
Tessl Logo

yes-or-no/gitlab-commitflow

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

Quality

82%

Does it follow best practices?

Impact

No eval scenarios have been run

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

post-commit.shscripts/

#!/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 ✓"

scripts

add-member.sh

cleanup-merged.sh

install-hooks.sh

monthly.sh

post-commit.sh

SKILL.md

tile.json