Я использую 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'
(удалите , ^
если вам не нужно, чтобы номер билета был в начале очереди).