git フックとは
特定のgitアクションが行われた時に、スクリプトを実行する
1. それぞれがフックが動くタイミングは?
2. フックをインストール
- プロジェクトのディレクトリへ移動
- .git/hooks/pre-push.sampleのサンプルをhookスクリプトをgit/hooks/へコピー or
- gitで管理したい場合.setup/hooks/に配置しhookスクリプトをgit/hooks/へコピー
cp .git/hooks/pre-push.sample .git/hooks/pre-push
3. 「masterに直接pushミス」への対策
vim .git/hooks/pre-pushを編集
while read local_ref local_sha1 remote_ref remote_sha1 do if [[ "${remote_ref##refs/heads/}" = "master" ]]; then echo "Warning: push to remote master, continue? [y/N]" exec < /dev/tty read ANSWER case $ANSWER in "Y" | "y" | "yes" | "Yes" | "YES" ) echo "OK. push start.";; * ) echo "push failed.";exit 1;; esac exit 0 fi done
masterにはpushすると確認される
4. 「コミットコメントが空で何の対応をしたかわからない。」への対策
vim .git/hooks/commit-msgを編集
# TODO: コミットメッセージ条件については、方針が決まり次第下記に組み込む if [ $# -eq 1 ]; then if [ -z $1 ]; then echo "コミットメッセージを入れてください!!" exit 1 else echo "commit ok" exit 0 fi else echo "message無し" exit 1 fi fi
以下の様にcommit出来なくなる。git標準でメッセージが無かったらcommit出来ない気もするが、方針が決まったら実装入れていく
$ git ci -m '' コミットメッセージを入れてください!!
5 「マージ済みのブランチは自動で消す」への対策→結果フックで対応しない方がいいとの結論
vim .git/hooks/pre-pushを編集
#!/bin/sh -eu echo 'create release branch tag start' cd ~/Docker/teachme version=`cat .version` git branch develop/$version git push origin develop/$version git tag $version git push origin $version echo 'done'
hookの中でpushが走るから、無限ループになってしまう。失敗 push自体に無関係なものはフックにしない方がいい。スクリプトにしておけばよかった、、