对于上下文,我正在构建Jenkins作业以自动git标记我们的分支代码。想法是按照以下方式构造分支标记命名标准:
<latest_tag_in_branch>.<branch_name>.<revision>
我们假设分支名称为“ hotFix”。如果最新标记未在其中包含分支名称(例如2.0.55
),则我们应该在其后附加修订版1。例如
2.0.55.hotFix.1
如果在此hotFix分支上创建了另一个标签而不合并任何其他代码(因此最新的公共标签不变),则该标签将变为:
2.0.55.hotFix.2
如果我们然后与master合并,后者创建了后续标签(例如,以最新版本2.0.58为例),则该分支的下一个版本将“重置”为:
2.0.58.hotFix.1
命令:
git describe --abbrev=0 --tags
将为我获取最新标签。例如,它将是2.0.55
或2.0.55.hotFix.1
。如何在bash shell环境中使用此信息来完成其余的标签名?例如。追加<branch_name>.1
或将<revision>
加1。
到目前为止,我的代码:
> git describe --abbrev=0 --tags
(返回例如2.0.55或2.0.55.hotFix.3)
由于对bash经验不足,因此我不确定下一步的最佳方法。
答案 0 :(得分:1)
您可以将git
命令的输出pipe放入另一个可以操纵文本的进程中(我在这里更喜欢awk
)。
git describe --abbrev=0 --tags | awk -F. -v OFS=. '{
if (NF == 3) $0 = $0".hotFix.1"
else if (NF >= 5) $5 += 1
} 1'
这是为了将git
命令的输出重定向到awk
(作为输入)。
我们分别通过执行.
和-F.
将输入和输出定界符设置为-v OFS=.
。
awk
将运行我们用大括号提供的脚本。
我们的脚本将检查输入是否具有三个参数(对于2.0.55
)。 NF
是一个预定义的变量,在输入中存储 n 个字段。 $0 = $0".hotFix.1"
将.hotFix.1
连接到整个输入(即$0
)上。
如果输入没有三个参数,我们检查它是否至少有5个参数(NF >= 5
)。然后将第五个字段加1($5 += 1
)。
最后,一旦脚本运行完成,我们通过在右括号后面附加1
来打印语句。请注意,如果输入只有一个或两个字段,它将打印输入而未修改。
请注意,您也可以将awk
写在一行上。我选择将其写成几行,因为它更具可读性。
如果您希望使用正则表达式检查第五个字段是否为整数(在应用+= 1
之前,可以将else if
修改为
else if (NF >= 5 && $5 ~ /^[0-9]*$/) $5 += 1
这将检查字段(NF
)的数目是否大于5 ,并且检查第五个字段($5
)是否与(~
)匹配从开头(/.../
)到结尾([0-9]*
)带有数字(^
)的正则表达式模式($
)。
答案 1 :(得分:1)
branch_name="hotFix"
example1="2.0.55.hotFix.1"
example2="2.0.55"
regex_short="([0-9]+[.][0-9]+[.][0-9]+)"
regex_long="($regex_short[.]$branch_name)[.]([0-9]*)"
for example in $example1 $example2; do
if [[ $example =~ $regex_long ]]; then
prefix=${BASH_REMATCH[2]}
version=${BASH_REMATCH[3]}
let ++version
elif [[ $example =~ $regex_short ]]; then
prefix=${BASH_REMATCH[1]}
version=1
fi
nvers="$prefix.$branch_name.$version"
echo "old_version: $example -> new_version: $nvers"
done