0

あなたが git でコミットしようとしているメッセージのフックをしようとしています。コミットしようとしているときに私が通常行うことは [SOME_DESCRIPTION] Refs #[0-9]+ です

シェル スクリプトを作成したことはありませんが、プログラミング全般についてはかなり熟達しています。保存しようとしている現在のパターンが「*Refs #[0-9]+」であるかどうかを検証するスクリプトを commit-msg に書き込もうとしています。しかし、私はシェル構文の経験がなく、Linux もあまり使用していません。

  • $1 は現在のコミットメッセージを取得するためのものだと思いますが、おそらく間違っています。
  • そして、パターンをチェックする私の方法はおそらく間違っています
requireTicketRef=$1
if [[ $requireTicketRef == *Refs \#[0-9]+ ]]
then
    echo "Contains ticket reference"
    exit 0
else
    echo "Need to add ticket reference"
    exit 1
fi
4

1 に答える 1

1

コミット メッセージについてあなたが正しいと仮定すると$1、コードは近いものになりますが、bash が==in [[...で使用するパターン]]は正規表現ではありません。代わりに、ファイル名を展開するために使用されるのと同じ種類のワイルドカードであり、通常は「グロブ」と呼ばれ、特定の一致 (「1 つ以上の数字」など) を定量化する機能は通常ありません。

(それらは単一の単語でなければならないので、Refsと の間のスペースの前に別のバックスラッシュが必要です。また、単語の最初のものでない場合#、実際には の前にバックスラッシュは必要ありません。)#

これを修正するには、いくつかのオプションがあります。最も簡単なのは、おそらく実際の正規表現を使用することです。これは、内部で行うことができます[[...]]=~==

if [[ ! $requireTicketRef =~ Refs\ #[0-9]+ ]]; then 
  echo >&2 "Need to add ticket reference."
  exit 1
fi

もう 1 つのオプションは、(「拡張グロブ」) オプションをオンにすることextglobです。これは、Korn シェルからいくつかの構文を借用して、正規表現のような機能 (否定、代替、数量化) をグロブ パターンにもたらします。

shopt -s extglob
if [[ ! $requireTicketRef == *Refs\ #+([0-9])* ]]; then 
  echo >&2 "Need to add ticket reference."
  exit 1
fi
于 2013-05-07T02:23:22.557 に答える