我正在使用 shell 编写一个 git hook 文件,以在提交之前检查我的提交消息。我是一个完全的初学者,这是我尝试过的:
我的commit-msg
钩子文件如下:
#!/bin/sh
msg=`head -n 1 $1`
if echo $msg | egrep -qv '(Android-\d{3,4}.{20,})'; then
echo "[Message Format] Your message is not formatted correctly. Correct message format\n
#Ticket Number - Minimum 20 or more Character \n
like #Android-123 Bug fixed for login issue"
exit 1;
fi
所以每当我发出这样的提交消息时:
git commit -m " #Android-123 I pretty sure this is more than 20 character,but it still failed to commit"
所以我很确定我的提交消息和票号超过 20 个字符,但每次提交时仍然会出现我设置的错误。
我认为我的逻辑问题是我应该使用if not echo $msg | egrep -qv '(Android-\d{3,4}.{20,})'
,所以我尝试:
if ! [[echo $msg | egrep -qv '(Android-\d{3,4}.{20,})']] ;
then....
但这给了我这个错误: .git/hooks/commit-msg: line 5: syntax error near unexpected token !'
问题:
即使我发出了正确的提交消息,我出了什么问题导致无法提交?
我该如何修复它?
答案1
您的正则表达式使用 PCRE 语法,例如\d
,但是grep -E
(这就是您的语法egrep
,但使用grep -E
它egrep
已被弃用)不明白这一点。另外,您不需要那里的括号,您实际上并没有捕获任何内容。如果你有 GNU grep
,你可以使用grep -P
:
grep -Pqv 'Android-\d{3,4}.{20,}'
如果没有,您将必须替换\d
为[0-9]
:
grep -Eqv 'Android-[0-9]{3,4}.{20,}'
但是,您不需要(或想要)只获取文件的第一行,您可以直接 grep 整个文件。您也不需要反转匹配 ( -v
),这只会让事情变得复杂。这是脚本的一个更简单的工作版本,用于if !
否定条件:
#!/bin/sh
if ! grep -E 'Android-[0-9]{3,4}.{20,}' "$1"; then
printf "[Message Format] Your message is not formatted correctly. Correct message format:
#Ticket Number - Minimum 20 or more Character
like #Android-123 Bug fixed for login issue\n"
exit 1;
fi
答案2
在这里,我会这样做:
#! /bin/sh -
file="${1?No file specified}"
die() {
printf >&2 '%s\n' "$@"
exit 1
}
awk '
BEGIN {ret = !ok}
/^#Android-[[:digit:]]{3,4}[^[:digit:]].{19}/ {ret = ok}
{exit}
END {exit ret}' < "$file" || die \
'[Message Format] Your message is not formatted correctly. Correct message format:' \
'#Ticket Number - Minimum 20 or more Character' \
'like #Android-123 Bug fixed for login issue'
(^
如果您不需要票号位于行首,请删除 )。