git打标签脚本

[TOC]

用git做发布管理至少涉及到两类分支:开发分支和发布分支。每次发布新内容都会基于指定的发布分支打一个tag,而tag通常会以1.0.0的形式命名。 若发布内容存在差异,则需要管理多个发布分支

releasse_x/1.0.0
releasse_y/1.1.0
releasse_z/1.1.5
...

git打标签的流程

# 1. 切换到目标分支
git checkout [需要打标签的分支]
# 2. 合并各项修改内容到分支
git merge feat-xxx
git merge bug-xxx
...
# 3. 定义标签
git tag [标签名称/版本号]
# 4. 该标签提交到哪个仓库
git push --set-upstream origin [标签名称]
# 5. 推送到远端
git push origin --tags

以上打标签至少经历5个操作,其中有两处很容易操作出错,影响打版结果

  • 第1步,如果现在处于【开发分支】,但忘记要先切换分支再打标签,并且缺少检查,则会将【开发分支】的内容到发布到线上
  • 第3步,[标签名称/版本号]填写错误,导致某段打标签日志没有连续顺序

为此,我写了一个脚本固定以上打标签的流程

获取最近一次tag版本号

自增的前提是,能找到上次的版本号,下例假设tag的格式: release_x/1.0.0,

  • git tag -l --sort=-v:refname按数字降序返回所有标签,``
  • grep筛选release_x分支的标签
  • head -n 1返回首行数据,即最后一次标签
  • awk -F"/" '{print $NF}'`提取版本号

最终命令git tag -l --sort=-v:refname | grep "^$BRANCH_NAME/" | head -n 1 | awk -F"/" '{print $NF}'

tag版本号自增

awk分离出3位版本号,分别累加awk -F"." "$TAG_EVAL"``

等待步骤2提交修改内容

打到标签的内容是不确定的,可多可少。脚本会暂下来,提示你先提交好合并内容,再继续。最终内容会按本地修改打标签,如果没有内容要修改直接按[Yy]继续执行

$ sh tag.sh test
error: pathspec 'test' did not match any file(s) known to git
Switched to branch 'test'
目标分支:	test
上次标签:	nil
本次标签:	1.0.0
是否已准备好提交内容? (y/n):  

脚本参数

tag.sh [需要打tag的目标分支] [第x版本号需要自增] 若上次为release_x/1.0.0, 举例以下情况

  • tag.sh release_x 1 # 输出标签 release_x/2.0.0
  • tag.sh release_x 2 # 输出标签 release_x/1.1.0
  • tag.sh release_x 3 # 输出标签 release_x/1.0.1
#!/bin/sh

BRANCH_NAME=$1
if [ -z "$BRANCH_NAME" ]; then
    echo "先指定提交分支 tag.sh [分支名称]"
    exit
fi

# 确保目标分支存在
git checkout $BRANCH_NAME
if [ $? -ne 0 ]; then 
    git branch $BRANCH_NAME
    git checkout $BRANCH_NAME
    if [ $? -ne 0 ]; then 
        exit
    fi
fi

# 默认累加版本号最后一位
TARGET_NUM=${2:-3}
git fetch --all -t -f
LAST_TAG=`git tag -l --sort=-v:refname | grep "^$BRANCH_NAME/" | head -n 1 | awk -F"/" '{print $NF}'`

if [ -z "$LAST_TAG" ]; then
    LAST_TAG="nil"
    NEW_TAG="1.0.0"
else
    # 对应版本位累加1
    TAG_EVAL='{print $1"."$2"."$3}'
    if [ $TARGET_NUM -eq 1 ]; then
        TAG_EVAL='{print $1+1"."0"."0}'
    elif [ $TARGET_NUM -eq 2 ]; then
        TAG_EVAL='{print $1"."$2+1"."0}'
    elif [ $TARGET_NUM -eq 3 ]; then
        TAG_EVAL='{print $1"."$2"."$3+1}'
    fi
    NEW_TAG=`echo $LAST_TAG | awk -F"." "$TAG_EVAL"`
fi

#printf "TAG_EVAL:\t%s\n" "$TAG_EVAL"
printf "目标分支:\t%s\n" $BRANCH_NAME
printf "上次标签:\t%s\n" $LAST_TAG
printf "本次标签:\t%s\n" $NEW_TAG

# 挂起推送,并且检查提交内容,如遴选
while true; do
    read -p "是否已准备好提交内容? (y/n): " yn
    case $yn in
        [Yy]* ) 
            echo "Continuing the script..."
            # 在此处放置要继续执行的命令
            break
            ;;
        [Nn]* ) 
            echo "Exiting the script."
            exit
            ;;
        * ) 
            echo "Please answer y or n."
            ;;
    esac
done

# 按下[Yy],即准备好提交内容,推送更新
git tag $BRANCH_NAME/$NEW_TAG
git push --set-upstream origin $BRANCH_NAME
git push origin --tags

原文:
https://lizijie.github.io/2024/08/22/git%E6%89%93%E6%A0%87%E7%AD%BE%E8%84%9A%E6%9C%AC.html
作者github:
https://github.com/lizijie

PREVIOUSdocker容器和数据据迁移
NEXTgit笔记