我正在尝试创建一个 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 退出。
问题是:
如果分支名称以该字符串结尾,我不知道如何使用 tr/sed 仅替换“@squashed”。
如果当前分支以列表中的分支名称之一开头,我无法弄清楚如何循环遍历元素并以非零值退出。
答案1
tr
替换单个字符,而不是字符串。正如您猜测的那样,您可以使用sed
删除行末尾的字符串:git branch --merged dev | sed 's/@squashed$//'
不使用循环,而是使用
grep
来确定字符串列表(每行一个)是否包含以引用字符串开头的行:git branch --merged dev | sed 's/@squashed$//' | grep -q "^..$current_branch"
更好的是,既然您正在使用git
,请让它为您过滤:
git branch --list "${current_branch}*" --merged dev
将列出与其dev
名称以当前分支开头的任何合并的分支。 (由于您是通过匹配分支名称的开头来进行过滤的,因此您不需要删除“@squashed”部分,除非我遗漏了某些内容。)