コミットする前に、コミットメッセージを確認するためにシェルを使用して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'
(^
行の先頭にチケット番号が必要ない場合は削除してください。)