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笔记