サーチ…


構文

  • .git / hooks / applypatch-msg
  • .git / hooks / commit-msg
  • .git / hooks / post-update
  • .git / hooks / pre-applypatch
  • .git / hooks / pre-commit
  • .git / hooks / prepare-commit-msg
  • .git / hooks / pre-push
  • .git / hooks / pre-rebase
  • .git / hooks / update

備考

--no-verifyまたは-n指定されたgitコマンドのすべてのローカルフックをスキップします。
例: git commit -n

このページの情報はGit公式ドキュメントアトラシアンから集められました。

Commit-msg

このフックはprepare-commit-msgフックに似ていますが、ユーザーが以前よりもコミットメッセージを入力した後に呼び出されます。これは通常、コミットメッセージの形式が間違っている場合に開発者に警告するために使用されます。

このフックに渡される唯一の引数は、メッセージを含むファイルの名前です。ユーザーが入力したメッセージが気に入らない場合は、このファイルをインプレース( prepare-commit-msgと同じ)に変更するか、ゼロ以外のステータスで終了することによってコミットを完全に中断できます。

次の例は、コミット・メッセージにワード番号の後に数字があるかどうかをチェックするために使用されます

word="ticket [0-9]"
isPresent=$(grep -Eoh "$word" $1)

if [[ -z $isPresent ]]
  then echo "Commit message KO, $word is missing"; exit 1;
  else echo "Commit message OK"; exit 0;
fi

ローカルフック

ローカルフックは、ローカルのリポジトリにのみ影響します。各開発者はローカルフックを変更することができるため、コミットポリシーを実施する方法として確実に使用することはできません。開発者は特定のガイドラインを遵守し、潜在的な問題を回避することが容易になるように設計されています。

ローカルコミットには、事前コミット、準備コミットメッセージ、コミットメッセージ、ポストコミット、ポストチェックアウト、およびプレリベースがあります。

最初の4つのフックはコミットに関連しており、コミットのライフサイクルで各パートを何らかの形で制御することができます。最後の2つは、git checkoutコマンドとgit rebaseコマンドのいくつかの追加アクションまたは安全性チェックを実行できるようにします。

すべての "プリ"フックでは、実行しようとしている動作を変更できますが、 "ポスト"フックは主に通知に使用されます。

ポストチェックアウト

このフックはpost-commitフックと同様に機能しますが、 git checkout参照をチェックアウトすると呼び出されます。これは、混乱の原因になる自動生成ファイルの作業ディレクトリをクリアするのに便利なツールです。

このフックは3つのパラメータを受け取ります:

  1. 前のHEADのref、
  2. 新しいHEADのref、
  3. ブランチ・チェックアウトかファイル・チェックアウトかを示すフラグ(それぞれ1または0 )。

その終了ステータスは、 git checkoutコマンドに影響しません。

コミット後

このフックは、 commit-msgフックの直後に呼び出されます。 git commit操作の結果を変更することはできないため、主に通知目的で使用されます。

スクリプトはパラメータを取らず、終了ステータスは決してコミットに影響しません。

受信後

このフックは、成功したプッシュ操作の後に呼び出されます。通常、通知の目的で使用されます。

スクリプトにはパラメータはありませんが、標準入力からのpre-receiveと同じ情報が送信されます。

<old-value> <new-value> <ref-name>

事前コミット

このフックはgit commitを実行するたびに実行され、 git commitしようとしていることを確認します。このフックを使用して、コミットしようとしているスナップショットを検査できます。

このタイプのフックは、自動テストを実行して、着信コミットによってプロジェクトの既存の機能が中断されないことを確認するのに便利です。このタイプのフックは、空白またはEOLエラーをチェックすることもできます。

引数はプリコミットスクリプトに渡されず、ゼロ以外の状態で終了するとコミット全体が中止されます。

Prepare-commit-msg

このフックは、テキストエディタにコミットメッセージを設定するために、 pre-commitフックの後に呼び出されます。これは、通常、縮小またはマージされたコミットのために自動的に生成されたコミットメッセージを変更するために使用されます。

このフックには1〜3つの引数が渡されます。

  • メッセージを含む一時ファイルの名前。
  • コミットのタイプ。
    • メッセージ( -mまたは-Fオプション)、
    • テンプレート( -tオプション)、
    • マージ(マージコミットの場合)、または
    • スカッシュ(他のコミットが潰れている場合)
  • 関連するコミットのSHA1ハッシュ。これは、 -c-C 、 - --amendオプションが与えられた場合にのみ与えられます。

pre-commitと同様に、ゼロ以外の状態で終了すると、コミットが中止されます。

プレ・リベース

このフックは、 git rebaseがコード構造を変更する前に呼び出されます。このフックは、通常、リベース操作が適切であることを確認するために使用されます。

このフックには2つのパラメータがあります:

  1. シリーズがフォークされた上流ブランチ、および
  2. ブランチはリベースされます(現在のブランチをリベースするときは空です)。

ゼロ以外のステータスで終了することによって、リベース操作を中止することができます。

事前受信

このフックは誰かがgit pushを使ってコミットをリポジトリにプッシュするたびに実行されます。常にプッシュの宛先であるリモートリポジトリに存在し、元の​​(ローカル)リポジトリには存在しません。

参照が更新される前にフックが実行されます。これは、通常、あらゆる種類の開発ポリシーを実施するために使用されます。

スクリプトにはパラメータはありませんが、プッシュされている各refは、標準入力の別の行にあるスクリプトに次の形式で渡されます。

<old-value> <new-value> <ref-name>

更新

このフックはpre-receive後に呼び出され、同じ方法で動作します。何かが実際に更新される前に呼び出されますが、一度にすべてのrefではなく、pushされたrefごとに別々に呼び出されます。

このフックは、次の3つの引数を受け取ります。

  • 更新される参照の名前、
  • refに格納されている古いオブジェクト名
  • refに格納されている新しいオブジェクト名。

これはpre-receive渡された同じ情報ですが、 updateがrefごとに個別に呼び出されるため、いくつかのrefを拒否して他のものを許可することができます。

プッシュプッシュ

Git 1.8.2以降で利用可能です。

1.8

プッシュプッシュフックを使用して、プッシュの進行を防ぐことができます。これは、特定のブランチへの誤った手動プッシュのブロック、または確立されたチェックが失敗した場合のプッシュのブロック(ユニットテスト、構文)を含む。

事前にプッシュフックは単に名前のファイル作成することによって作成されるpre-push.git/hooks/ :ファイルが実行可能である、と( 落とし穴警告を )確認しchmod +x ./git/hooks/pre-push

Hannah Wolfeの一例を紹介します。

#!/bin/bash

protected_branch='master'  
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

if [ $protected_branch = $current_branch ]  
then  
    read -p "You're about to push master, is that what you intended? [y|n] " -n 1 -r < /dev/tty
    echo
    if echo $REPLY | grep -E '^[Yy]$' > /dev/null
    then
        exit 0 # push will execute
    fi
    exit 1 # push will not execute
else  
    exit 0 # push will execute
fi  

Volkan Unsalの例では、プッシュを許可する前にRSpecテストが成功することを確認しています:

#!/usr/bin/env ruby
require 'pty'
html_path = "rspec_results.html"
begin
  PTY.spawn( "rspec spec --format h > rspec_results.html" ) do |stdin, stdout, pid|
  begin
    stdin.each { |line| print line }
  rescue Errno::EIO
  end
end
rescue PTY::ChildExited
  puts "Child process exit!"
end

# find out if there were any errors  
html = open(html_path).read
examples = html.match(/(\d+) examples/)[0].to_i rescue 0
errors = html.match(/(\d+) errors/)[0].to_i rescue 0
if errors == 0 then
  errors = html.match(/(\d+) failure/)[0].to_i rescue 0
end
pending = html.match(/(\d+) pending/)[0].to_i rescue 0

if errors.zero?
  puts "0 failed! #{examples} run, #{pending} pending"
  # HTML Output when tests ran successfully:
  # puts "View spec results at #{File.expand_path(html_path)}"
  sleep 1
  exit 0
else
  puts "\aCOMMIT FAILED!!"
  puts "View your rspec results at #{File.expand_path(html_path)}"
  puts
  puts "#{errors} failed! #{examples} run, #{pending} pending"
  # Open HTML Ooutput when tests failed
  # `open #{html_path}`
  exit 1
end

あなたが見ることができるように、多くの可能性がありますが、良いことが起こった場合はexit 0exit 1 、悪いことが起きた場合はexit 1exit 1ます。いつでもexit 1exit 1するとプッシュは防止され、コードはgit push...実行する前の状態になりgit push...

クライアントサイドフックを使用する場合は、プッシュで「--no-verify」オプションを使用することで、すべてのクライアントサイドフックをスキップできます。プロセスを強制するためにフックに頼っているのであれば、燃え尽きる可能性があります。

ドキュメント: https : //git-scm.com/docs/githooks#_pre_push
公式サンプル: https : //github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample

コミットする前にMavenビルド(または他のビルドシステム)を確認する

.git/hooks/pre-commit

#!/bin/sh
if [ -s pom.xml ]; then
    echo "Running mvn verify"
    mvn clean verify
    if [ $? -ne 0 ]; then
        echo "Maven build failed"
        exit 1
    fi
fi

特定のプッシュを他のリポジトリに自動的に転送する

post-receiveフックを使用して、入ってくるプッシュを自動的に別のリポジトリに転送することができます。

$ cat .git/hooks/post-receive

#!/bin/bash

IFS=' '
while read local_ref local_sha remote_ref remote_sha
do

  echo "$remote_ref" | egrep '^refs\/heads\/[A-Z]+-[0-9]+$' >/dev/null && {
    ref=`echo $remote_ref | sed -e 's/^refs\/heads\///'`
    echo Forwarding feature branch to other repository: $ref
    git push -q --force other_repos $ref
  }

done

この例では、 egrep regexpは特定のブランチ形式を探します(ここでは、JIRAの問題に名前を付けるためにJIRA-12345が使用されています)。もちろん、すべてのブランチを転送したい場合は、この部分をオフにすることができます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow