커밋하기 전에 커밋 메시지를 확인하기 위해 쉘을 사용하여 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
사용하는 것은 더 이상 사용되지 않습니다) 그것을 이해하지 못합니다. 또한 거기에는 괄호가 필요하지 않으며 실제로 아무것도 캡처하지 않습니다. GNU가 있는 경우 다음을 대신 사용할 수 있습니다 .grep -E
egrep
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'
( ^
줄 시작 부분에 티켓 번호가 필요하지 않은 경우 제거하십시오).