首页 文章

如何在bash shell环境中自动增加文件名版本?

提问于
浏览 1763 次
1

对于上下文,我正在构建一个Jenkins作业来自动git标记我们的分支代码 . 我们的想法是构建一个分支标签命名标准,如下所示:

<latest_tag_in_branch>.<branch_name>.<revision>

让's assume a branch name of ' hotFix '. If the latest tag doesn' t中包含分支名称(例如 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.552.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方面相对缺乏经验,我不确定下一步该做什么的最佳方法 .

2 回答

  • 0
    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
    
  • 0

    您可以pipe git 命令的输出到另一个可以操作文本的进程(我更喜欢这里的awk) .

    git describe --abbrev=0 --tags | awk -F. -v OFS=. '{
     if (NF == 3) $0 = $0".hotFix.1"
     else if (NF >= 5) $5 += 1
    } 1'
    

    这样做是因为它会将输出重定向到 awk (作为输入) .

    • 我们分别通过 -F.-v OFS=. 将输入和输出分隔符设置为 . .

    • awk 将运行我们在大括号中提供的脚本 .

    • 我们的脚本将检查输入是否有三个参数(在 2.0.55 的情况下) . NF 是一个预定义变量,用于在输入中存储 nn . $0 = $0".hotFix.1".hotFix.1 连接到整个输入(即 $0 ) .

    • 如果输入没有三个参数,我们检查它是否至少有5个参数( NF >= 5 ) . 然后将第五个字段递增1( $5 += 1 ) .

    • 最后,一旦脚本运行完毕,我们通过在结束括号后附加 1 来打印语句 . 请注意,如果输入只有一个或两个字段,则会打印未修改的输入 .

    请注意,您也可以在一行中编写awk . 我选择在几行上写它,因为它有点可读性 .

相关问题