Shell / Git脚本:当前提交消息的模式匹配

时间:2013-05-06 21:32:21

标签: git bash shell

我正在尝试为你要在git上提交的消息做一个钩子。我通常在提交时做的是[SOME_DESCRIPTION]参考#[0-9] +

我之前从未做过shell脚本,但我对编程很擅长。我正在尝试在commit-msg中编写一个脚本,该脚本将验证您尝试保存的当前是否具有“* Refs#[0-9] +”模式。但我没有shell语法经验,也没有太多linux。

  • 我认为$ 1是获取当前提交消息,但我可能错了。
  • 我检查模式的方式可能是错误的
requireTicketRef=$1
if [[ $requireTicketRef == *Refs \#[0-9]+ ]]
then
    echo "Contains ticket reference"
    exit 0
else
    echo "Need to add ticket reference"
    exit 1
fi

1 个答案:

答案 0 :(得分:1)

假设您$1是提交消息是正确的,那么您的代码就很接近了,但bash在==[[使用的模式... ]]不是正则表达式。它们是用于扩展文件名的相同类型的通配符,通常称为“globs”,通常无法量化特定匹配(如“1位或更多位”)。

(它们也必须是一个单词,因此您需要在Refs#之间的空格前面添加另一个反斜杠。而您实际上不需要在#[[之前的空格。 {1}}当它不是一句话中的第一句话时。)

您有几种方法可以解决此问题。最简单的可能就是使用实际的正则表达式,只需使用]]代替=~,就可以在== ... if [[ ! $requireTicketRef =~ Refs\ #[0-9]+ ]]; then echo >&2 "Need to add ticket reference." exit 1 fi 内执行:

extglob

另一种选择是打开shopt -s extglob if [[ ! $requireTicketRef == *Refs\ #+([0-9])* ]]; then echo >&2 "Need to add ticket reference." exit 1 fi (“扩展的glob”)选项,该选项借用了Korn shell的一些语法,为类型集合带来了类似正则表达式的功能(否定,交替,量化)。

{{1}}