커밋하기 전에 커밋 메시지를 확인하기 위해 쉘을 사용하여 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할 수 있습니다. 또한 match( )를 뒤집을 필요도 없습니다 -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'
( ^
줄 시작 부분에 티켓 번호가 필요하지 않은 경우 삭제하십시오.)