49

新しいブランチが Git でチェックアウトされた後にフックをトリガーする方法はありますか?

4

4 に答える 4

52

git フックは、リポジトリの特別な場所に配置されるスクリプトです。その場所は次のとおりです。

.git/フック

スクリプトは、bash、python、ruby など、環境内で実行できる任意の種類にすることができます。

チェックアウト後に実行されるフックはpost-checkoutです。ドキュメントから:

...フックには 3 つのパラメータが与えられます...

例:

  1. フック (スクリプト) を作成します。

    touch .git/hooks/post-checkout
    chmod u+x .git/hooks/post-checkout
    
  2. フックのサンプル コンテンツ:

#!/bin/bash                                                                      

set -e                                                                           

printf '\npost-checkout hook\n\n'                                                

prevHEAD=$1                                                                      
newHEAD=$2                                                                       
checkoutType=$3                                                                  

[[ $checkoutType == 1 ]] && checkoutType='branch' ||                             
                            checkoutType='file' ;                                

echo 'Checkout type: '$checkoutType                                              
echo '    prev HEAD: '`git name-rev --name-only $prevHEAD`                       
echo '     new HEAD: '`git name-rev --name-only $newHEAD`

注: 最初の行のシバンは、スクリプトの種類を示します。

このスクリプト (git フック) は、渡された 3 つのパラメーターのみをキャプチャし、わかりやすい形式で出力します。

于 2014-01-02T22:18:21.423 に答える
40

これらのフックのいずれかがそれを行わない場合、私は驚くでしょう:

https://schacon.github.io/git/githooks.html

たぶんこれ

チェックアウト後

このフックは、ワークツリーを更新した後に git-checkout が実行されたときに呼び出されます。フックには 3 つのパラメータが与えられます: 前の HEAD の参照、新しい HEAD の参照 (変更されているかどうかにかかわらず)、およびチェックアウトがブランチ チェックアウト (ブランチの変更、フラグ = 1) であったかどうかを示すフラグ、またはファイルのチェックアウト (インデックスからファイルを取得、フラグ = 0)。このフックは git-checkout の結果に影響を与えることはできません。

于 2009-06-18T09:33:55.253 に答える
11

他のものと似ていますが、ブランチが一度チェックアウトされていることを確認します。

#!/bin/bash

# this is a file checkout – do nothing
if [ "$3" == "0" ]; then exit; fi

BRANCH_NAME=$(git symbolic-ref --short -q HEAD)
NUM_CHECKOUTS=`git reflog --date=local | grep -o ${BRANCH_NAME} | wc -l`

#if the refs of the previous and new heads are the same 
#AND the number of checkouts equals one, a new branch has been created
if [ "$1" == "$2"  ] && [ ${NUM_CHECKOUTS} -eq 1 ]; then
    git push origin ${BRANCH_NAME}
fi
于 2016-02-03T16:09:55.197 に答える