如何创建git钩子的黑名单或分支列表?

如何创建git钩子的黑名单或分支列表?,git,githooks,sh,Git,Githooks,Sh,我试图在git的PostRecieve电子邮件钩子中添加一些功能,要么忽略特定分支,要么只发送特定分支上的电子邮件(显然,这些选项是互斥的)。我不想将分支列表硬编码到钩子本身中,而是使用存储库配置文件的[hooks]部分 我正在努力保持shell bourne shell的兼容性,同时仍然能够看到分支名称是白名单还是黑名单的一部分 我想我可以这样做: whitelist=$(git hooks.branch_whitelist) while read oldrev newrev refname

我试图在git的PostRecieve电子邮件钩子中添加一些功能,要么忽略特定分支,要么只发送特定分支上的电子邮件(显然,这些选项是互斥的)。我不想将分支列表硬编码到钩子本身中,而是使用存储库配置文件的[hooks]部分

我正在努力保持shell bourne shell的兼容性,同时仍然能够看到分支名称是白名单还是黑名单的一部分

我想我可以这样做:

whitelist=$(git hooks.branch_whitelist)
while read oldrev newrev refname
do
  branch_name=${refname#refs/heads/}
  for wl_branch in $whitelist
  do
    if [ $branch_name = $wl_branch ] 
      ... send email ...
      break # prevents multiple emails on malformed whitelist string
  done
done
出于某种原因,上述观点似乎是错误的。有没有人有更好的方法来检查字符串是否是列表的成员(如果我理解正确的话,这不是bourne中支持的数据结构)


编辑:能够进行部分字符串匹配也很好(例如,黑名单所有那些-dev分支),但我反复找到的唯一答案是bash的双括号方法。

这与其说是git问题,不如说是shell问题,但我已经写过这样的东西了。下面是函数:

# Is $1 in a list?
in_list()
{
        local match i

        match="$1"
        shift
        set -- $(echo "$@" | sed 's/,/ /g')
        for i do
                [ "$i" = "$match" ] && return 0 # i.e., "true"
        done
        return 1 # i.e., "false"
}
以及一个使用它的示例:

if in_list $branch_name $(git config --get hooks.foo); then ...
列表的形式为空格和/或逗号分隔的条目:

git config hooks.foo eh,bee,sea,de,e
或:

(或两者的任意组合)

如果您想支持某种正则表达式或shell全局绑定,那么很明显,1如何修改列表中的
来实现这一点

请注意,最新和最好的post receive电子邮件挂钩现在是Python脚本,而不是shell脚本


1如果不明显:
[
实际上是一个命令(也拼写为
test
),那么您可以运行任何命令来比较
$match
$i
expr
可以执行(基本)正则表达式:

expr "$match" : "${i}$" >/dev/null && return 0
将查看
$match
(分支名称)是否匹配列表中的任何正则表达式。使用
${i}$
的原因是
expr
左锚定测试(一个Python的
re.match()
)但是不正确定位,因此
*-dev
匹配
x-dev
以及
x-dev
,这可能不是您的意思。例如,您可以将
hooks.foo
设置为
*-dev
(或将其包含在值列表中)

对于shell globbing(普通
/bin/sh
),请使用
case
而不是
test
/
[

case "$match" in
$i) return 0;;
esac

在这里,您可以将
hooks.foo
设置为
*-dev
,或包括
*-dev

的内容。这与其说是git问题,不如说是shell问题,但我已经编写了这样一个东西。函数如下:

# Is $1 in a list?
in_list()
{
        local match i

        match="$1"
        shift
        set -- $(echo "$@" | sed 's/,/ /g')
        for i do
                [ "$i" = "$match" ] && return 0 # i.e., "true"
        done
        return 1 # i.e., "false"
}
以及一个使用它的示例:

if in_list $branch_name $(git config --get hooks.foo); then ...
列表的形式为空格和/或逗号分隔的条目:

git config hooks.foo eh,bee,sea,de,e
或:

(或两者的任意组合)

如果您想支持某种正则表达式或shell全局绑定,那么很明显,1如何修改列表中的
来实现这一点

请注意,最新和最好的post receive电子邮件挂钩现在是Python脚本,而不是shell脚本


1如果不明显:
[
实际上是一个命令(也拼写为
test
),那么您可以运行任何命令来比较
$match
$i
expr
可以执行(基本)正则表达式:

expr "$match" : "${i}$" >/dev/null && return 0
将查看
$match
(分支名称)是否匹配列表中的任何正则表达式。使用
${i}$
的原因是
expr
左锚定测试(一个Python的
re.match()
)但是不正确定位,因此
*-dev
匹配
x-dev
以及
x-dev
,这可能不是您的意思。例如,您可以将
hooks.foo
设置为
*-dev
(或将其包含在值列表中)

对于shell globbing(普通
/bin/sh
),请使用
case
而不是
test
/
[

case "$match" in
$i) return 0;;
esac
在这里,您可以将
hooks.foo
设置为
*-dev
,或包括
*-dev
的内容