サーチ…
構文
- .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
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つのパラメータを受け取ります:
- 前のHEADのref、
- 新しいHEADのref、
- ブランチ・チェックアウトかファイル・チェックアウトかを示すフラグ(それぞれ
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つのパラメータがあります:
- シリーズがフォークされた上流ブランチ、および
- ブランチはリベースされます(現在のブランチをリベースするときは空です)。
ゼロ以外のステータスで終了することによって、リベース操作を中止することができます。
事前受信
このフックは誰かが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以降で利用可能です。
プッシュプッシュフックを使用して、プッシュの進行を防ぐことができます。これは、特定のブランチへの誤った手動プッシュのブロック、または確立されたチェックが失敗した場合のプッシュのブロック(ユニットテスト、構文)を含む。
事前にプッシュフックは単に名前のファイル作成することによって作成される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 0
をexit 1
、悪いことが起きた場合はexit 1
をexit 1
ます。いつでもexit 1
をexit 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が使用されています)。もちろん、すべてのブランチを転送したい場合は、この部分をオフにすることができます。