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