4

コミットメッセージの1つでもルールを満たさない場合に、各プッシュが拒否されるポリシーを適用しようとしています。開発者がローカルリポジトリで使用できるようにフックを配布しましたが、開発者がオリジンにプッシュするときにもこれを適用したいと思います。

2つの質問があります:

  1. 更新フックまたは事前受信フックを使用する必要がありますか?(update.secondaryフックを設定しようとしましたが、事前受信では発生しますが、発生しないようです)。

  2. プッシュに含まれる各コミットのメッセージを取得するにはどうすればよいですか?より具体的には、各コミットメッセージに特定の「有効な」(私のニーズに合わせて)プレフィックスを付けたいと思います。したがって、このプッシュのすべてのコミットをスキャンして、コミットメッセージを検証し、プッシュを受け入れる前に検証したいと思います。

単純なbashを使用してフックをコーディングしています。

ありがとう!

4

1 に答える 1

7

連鎖更新フックを使用する代わりに、Gitolite V3 で利用可能なVREFSを使用することをお勧めします。ここですべての引数を確認できます。

VREF は基本的にフックのようなものなので、このスクリプトのように、次のコマンドを使用して各コミットのログ メッセージを取得できます。git update git log --format=%s -1 $commit

git commit メッセージにポリシーを適用するスクリプトの例:

#!/bin/bash

refname="$1"
oldrev="$2"
newrev="$3"
result=0

# Make sure we handle the situation when the branch does not exist yet
if ! [ "$oldrev" = "0000000000000000000000000000000000000000" ] ; then
    excludes=( ^$oldrev )
else
    excludes=( $(git for-each-ref --format '^%(refname:short)' refs/heads/) )
fi

# Get the list of incomming commits
commits=`git rev-list $newrev "${excludes[@]}"`

# For every commit in the list
for commit in $commits
do
  # check the log message for ticket number
  message=`git log --format=%s -1 $commit`
  ticket=`echo "$message" | grep -o "^[A-Z]\{2,3\}-[0-9]\+"`
  if [ "$ticket" = "" ] ; then
    echo "Commit $commit does not start with a ticket number"
    result=1
  fi
done

exit $result

cwhsuはコメントで次のように述べています。

  • シェル スクリプトを使用してサーバー サイド フックを記述しようとしている場合は、おそらく " Can git pre-receivehooks evaluate the incoming commit? " を参照することをお勧めします。
    私は最終的に を取得しoldrev、シェルスクリプトで read を使用します newrevrefname

  • また、すべてゼロの SHA1 が意味するものもここにあります。

  • この行 " excludes=( ^$oldrev )" では、' ^' は単に除外を意味します。

于 2012-10-26T13:56:23.910 に答える