2009-06-18 11 views

答えて

26

これらのフックの1つは、それを行うことはありません場合、私はたぶんこの1

http://schacon.github.com/git/githooks.html

驚かれることと思います:

ポストチェックアウト

このフックはときに呼び出されますa がワークツリーを更新した後にgit-checkoutが実行されます。 チェックアウト分岐チェックアウト したかどうかを示す前頭部のREF(または変更されていなくてもよい)、新しいHEAD のREF、 フラグ(変更分岐:フックが3つのパラメータを が与えられます、フラグ= 1)またはファイル チェックアウト(ファイル からの検索、フラグ= 0)。このフックでは はgit-checkoutの結果に影響しません。

23

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つのパラメータをキャプチャし、人間にやさしい形式で出力します。

+0

これはブランチ作成チェックアウト(新しいHEADのreflogを見ている以外)であるかどうかを知る方法はありますか? – pkoch

+0

まったく新しい質問をするのはいい考えです。あなたがそうするなら、私にリンクを送ってください。私が助けることができるかどうかがわかります。あなたが解決しようとしている問題は何ですか? – givanse

+0

コミットがいくつかのブランチの先頭である場合、 'name-rev'はアルファベット順の名前だけを与えます。従って、元のブランチの名前の前にアルファベット順の名前を持つブランチをチェックアウトした後、 'prev HEAD'行はNEWブランチの名前を与えます。回避策: 'thisBranchName = $(git rev-parse --abbrev-ref HEAD);$(git branch --color = never - $ 1 | sed -e '/^..//'を含む)のブランチ用。 ["$(git show-ref -s $ branch)" == $ 1] && ["$ branch"!= "$ thisBranchName"]; を実行します。次に parentBranchName = $ branch; 休憩。 fi; ; done' – Ansa211

1

post-checkouthookは三つのパラメータ受け取る:前のHEADの

  1. 参考新しいHEADの
  2. 参考
  3. これは、ファイルのチェックアウト(0)または分岐チェックアウト(1
であるかどうかを

現在のHEADから作成されたブランチは、パラメータ1と2の値が同じになるという事実を利用できます。

cat > .git/hooks/post-checkout <<"EOF" 
if [ "$3" == "0" ]; then exit; fi 
if [ "$1" == "$2" ]; then 
    echo "New branch created. (Probably)." 
fi 
EOF 

chmod u+x .git/hooks/post-checkout 

制限事項:

  • は、現在のHEADがそれをだますだろうと同じHEADであることを起こる既存のブランチをチェックアウト。
  • 現在のHEADから新しいブランチを作成するではなく、が検出されません。
4

他と同様ですが、ブランチが一度チェックアウトされたことを確認します。

#!/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 
+1

これは正しい道のりで私を得ました、ありがとう! チェックアウトをカウントするためにgrep reflogを使用しているので、ブランチが以前存在していて、同じ名前の新しいブランチが作成された場合、そのブランチが新しいものとして認識されないことになります。それは、使用の場合に応じて、望ましい動作または問題になる可能性がありますが、私はそれに言及していただけです。 – Pwnrar

関連する問題