12

私の現在のブランチの命名規則は次のとおりです。

ticket-45-my-new-feature-branch-description

私は現在、.git/hooks/prepare-commit-msg ファイルでこのコードを使用して、すべてのコミット メッセージの前にブランチ名を次のように追加しています。

BRANCH_NAME=$(git branch 2>/dev/null | grep -e ^* | tr -d ' *')
if [ -n "$BRANCH_NAME" ] && [ "$BRANCH_NAME" != "master" ]; then
    echo "[$BRANCH_NAME] $(cat $1)" > $1
fi

最終結果:

[ticket-45-my-new-feature-branch-description] test commit

私が達成しようとしているのは、次のような出力です。

[ticket-45] test commit

ブラウニーは、大文字にできるかどうかを指摘しています。

[TICKET-45] test commit

説明的なブランチ名を保持したいのですが、コミットメッセージの先頭に追加されたテキストを切り捨てます。正規表現を使用する必要があると確信していますが、それを達成する方法が本当にわかりません。一度に複数のプロジェクトが進行しているため、ブランチ名は次のように異なります。

ticket-123-branch-name
abc-22-my-branch
ua-11-my-feature

唯一の共通点は、2 番目の「-」の前にすべてが必要であるという事実です。

どんな助けでも大歓迎です!!!

4

1 に答える 1

20

わかりました、まず、これ:

BRANCH_NAME=$(git branch 2>/dev/null | grep -e ^* | tr -d ' *')

やり過ぎです:-)使用:

branch=$(git symbolic-ref --short HEAD) || ...

現在のブランチ名を取得します。後の部分||は、「ブランチにいない場合の対処方法」(つまり、「切り離された頭」モードの場合) です。これは、自分で決定する必要があります。(現在のコードでは、BRANCH_NAME を空の文字列に設定しています。そのためには、この部分は必要ありませんが、symbolic-ref からの "fatal:" メッセージを回避するために、または||を追加することをお勧めします。)-q2>/dev/null

あとは基本的なスクリプトです。bash では正規表現を直接使用でき、古い sh ではexprorを呼び出すことができますsedsedとは両方ともtr大文字化できますが、 sed も正規表現を実行できるため、適切な候補のように見えます。

$ trimmed=$(echo $branch | sed -e 's:^\([^-]*-[^-]*\)-.*:\1:' -e \
    'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/')
$ echo $trimmed
TICKET-45

最後に、次のことを行うのは少し危険です。

echo "some stuff $(cat $1)" > $1

$(cat $1)部分の出力ファイルを切り捨てる前にシェルを展開することに依存しているため> $1です。(明らかに機能しますが、シェルの気まぐれの影響を受けます。) 一時ファイルを使用するか、別sedのインプレースファイルを使用することをお勧めします。

sed -i .bak -e "1s:^:[$trimmed] :" $1
# or use -i '', but note minor warning in sed man pages

上記は断片的にしかテストされていませんが、動作するはずです。

于 2013-11-09T02:25:00.537 に答える