检查当前分支是否在换行符分隔列表中

检查当前分支是否在换行符分隔列表中

我正在尝试创建一个 git 预提交挂钩。如果当前分支已经与集成分支合并,我不想允许新的提交到该分支。我有这个:

#!/usr/bin/env bash

git fetch origin dev
current_branch=`git rev-parse --abbrev-ref HEAD`
branches="$(git branch --merged dev | tr '@squashed' '')"

假设我有这两个分支:

me/feature/x
me/feature/x@squashed

我想做的是替换“@squashed”,所以我得到这个:

me/feature/x
me/feature/x

那么如果当前分支以这些名称之一开头,则以代码 1 退出。

问题是:

  1. 如果分支名称以该字符串结尾,我不知道如何使用 tr/sed 仅替换“@squashed”。

  2. 如果当前分支以列表中的分支名称之一开头,我无法弄清楚如何循环遍历元素并以非零值退出。

答案1

  1. tr替换单个字符,而不是字符串。正如您猜测的那样,您可以使用sed删除行末尾的字符串:

    git branch --merged dev | sed 's/@squashed$//'
    
  2. 不使用循环,而是使用grep来确定字符串列表(每行一个)是否包含以引用字符串开头的行:

    git branch --merged dev | sed 's/@squashed$//' | grep -q "^..$current_branch"
    

更好的是,既然您正在使用git,请让它为您过滤:

git branch --list "${current_branch}*" --merged dev

将列出与其dev名称以当前分支开头的任何合并的分支。 (由于您是通过匹配分支名称的开头来进行过滤的,因此您不需要删除“@squashed”部分,除非我遗漏了某些内容。)

相关内容