0

助けが要る

コミット メッセージに特定のキー ("!ignore") がある場合にコミット メッセージの解析を無視できるかどうかを確認するために、プリコミット フックを拡張しようとしていました。

この前の if 条件は、空のコミット メッセージがあるかどうかを確認するのと同じように機能します。しかし、このif条件がどういうわけか機能していません。

チェックキー「!ignore」を含まないメッセージ「SMARTCOMMITTEST」でコミットすると、コミットは成功します。これは、以下の If 条件が実行されなかったか、期待どおりに実行されなかったことを意味します。それで、何が悪いのかを理解しようとしています。

SMARTCOMMIT=1 
$SVNLOOK log -t "$TXN" "$REPOS" | grep "!ignore" | wc -c || SMARTCOMMIT=0
if [ $SMARTCOMMIT = 0];      
then
echo "Please use !ignore if you dont want to use smart commits in your commit message." 1>&2
exit 1
fi

いくつかのヒントをくれたEtanに感謝します...

コメントの他のif条件と同じように条件を変更したところ、うまくいきました

SMARTCOMMIT=$($SVNLOOK log -t "$TXN" "$REPOS" | grep "!ignore" | wc -c)                
if [ "$SMARTCOMMIT" = "0" ];  then
echo "Please use !ignore if you dont want to use smart commits in your commit message." 1>&2
exit 1
fi

これはうまくいきました..

@David W ..同じ場合に複数の条件をチェックする状況になりました

SMARTCOMMIT=$($SVNLOOK log -t "$TXN" "$REPOS" | grep '!ignore' | wc -c)
COMMITMESSAGENOREVIEW=$($SVNLOOK log -t "$TXN" "$REPOS" | grep '#comment' | wc -c)
COMMITMESSAGEWITHREVIEW=$($SVNLOOK log -t "$TXN" "$REPOS" | grep '+review' | wc -c)
 
if [ "$SMARTCOMMIT" =  "0" -a "$COMMITMESSAGENOREVIEW" = "0" -a "COMMITMESSAGEWITHREVIEW" = "0" ]; then
echo "Please use #comment or +review to enable smart commits or !ignore to not use smart commits." 1>&2
exit 1
fi

ここのリンクにあるように試しましたが、if条件がまったく実行されていません。これで私を助けてくれますか?

4

1 に答える 1

0

ステートメントはコマンドのif終了出力を見ることができるため、出力に応じて環境変数を設定する必要はありません。

shopt extglob > /dev/null  && extglob=1
if ! $SVNLOOK log -t "$TXN" "$REPOS" | grep -q '!ignore'
then
    echo 'Please use "!ignore" if you dont want to use smart commits in your commit message.' 1>&2
    exit 1
fi

これが実行されます$SVNLOOK log -t "$TXN" "$REPOS" | grep -q '!ignore'

-q静音モードです。grep文字列が存在する場合はゼロで終了し、存在しない場合は非ゼロになります。これを に入れると、if !が見つかったthen場合にのみ句が実行!ignoreされます。

が一重引用符で囲まれていることを確認するか、.の前に!ignorea を付ける必要があります。Bashにはcshタイプの履歴メカニズムがあり、それをオフにする方法はありません. シェルがを参照するたびに、プロセス ID 番号と関係があると見なします。\!!

于 2015-02-03T19:02:15.777 に答える