사용자가 git commit-message 창에서 형식화되지 않은 메시지를 제공하지 못하도록 제한하려고 합니다. 이를 위해 일부 형식화된 정규 표현식을 생성하고 이를 commit-msg 후크에 넣어 보았습니다.
하지만 git commit-message 문자열을 아래 정규식과 비교할 수 없습니다.
이 문제를 해결하는 데 도움을 주실 수 있나요?
regex="[A-Z]{3,}-[0-9][0-9]* #time (?:[0-9]+[wdhm])+ #comment (.|\n)*"
file=`cat $1`
echo $regex
echo $file
if [[ "$file" =~ $regex ]]; then
echo "Valid date"
else
echo "Pre-Commit hook is failed. commit-message format not met regex pattern Eg: TEST-123 #time 2w #comment added second line"
exit 1
fi
답변1
(?:...)
Perl 정규식 연산자입니다. 쉘에서 사용하려면zsh
또는 가 필요합니다ksh93
.bash
그들의 지원 없이. 어쨌든(...)
여기서는 표준 ERE를 사용할 수 있습니다.\n
일치하는 항목은 POSIX 확장 정규식에도 지정되지 않지만bash
(대부분의 시스템에서는 일치함n
).
ERE의 줄 바꿈도 어쨌든 일치됩니다 .- 어쨌든, 정규식은
[[ ... =~ ... ]]
연산자 에 고정되어 있지 않으므로<anything>*
적어도 빈 문자열과 일치하므로 확실히 일치하므로 끝에 있는 모든 항목은 중복됩니다. [A-Z]
실제로 POSIX 로케일 외부의 콘텐츠 일치는 매우 무작위입니다. 이는 아마도 영어 알파벳의 26개 대문자와 일치할 것이지만 더 많은 문자와 일치할 수도 있습니다(아마도 문자 시퀀스일 수도 있음)- 동일합니다.
[0-9]
로케일 및 시스템 일치 십진수 및 임의의 문자에 따라 다릅니다. $1
인용되지 않은 인수 확장은 쉘에서 매우 특별한 의미를 가지며, / 인용되지 않은 인수 를 그대로 둘 이유가 없습니다$regex...
.- 임의의 인수를 명령에 전달할 때 해당 인수가 옵션으로 처리되지 않도록 해야 합니다. 따라서
file=$(cat -- "$1")
또는file=$(cat < "$1")
ksh/zsh/bash를 사용합니다: (file=$(<"$1")
실패 시 0이 아닌 종료 상태를 반환하지 않을 수도 있지만). echo
임의의 데이터와 함께 사용할 수 없습니다- 다음 명령을 실행하기 전에 명령의 성공/실패 여부를 확인하는 것이 좋습니다.
- 오류는 일반적으로 stderr로 전송되어야 합니다.
uppercase=ABCDEFGHIJKLMNOPQRSTUVWXYZ
digit=0123456789
regexp="^[$uppercase]{3,}-[$digit]+ #time ([$digit]+[wdhm])+ #comment "
file=$(cat < "$1") || exit
printf '%s\n' "regexp: $regexp" "file: $file"
if [[ "$file" =~ $regexp ]]; then
echo valid
else
echo >&2 invalid
exit 1
fi
몇 가지 추가 참고 사항:
$(cat < "$1")
스트립 위의 명령 대체모두후행 개행 문자. 따라서 뒤에 오는 빈 줄은 파일 내용에서 제거됩니다.bash
반대로zsh
NUL 문자는 해당 변수에 저장할 수 없습니다. 입력 파일에 일부가 포함되어 있으면 경고 메시지와 함께 삭제됩니다(아마도 그럴 것입니다).
¹ On my GNU system, in a en_GB.UTF-8
locale (typical in Britain), it matches on at least ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸƁƆƇƊƎƏƐƓƘƟƠƢƯƳDŽDžLJLjNJNjǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬDZDzǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȘȚȜȞȦȨȪȬȮȰȲḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸ