諸行無常

IT色々お勉強中のブログ

git フックを使ってみた

git フックとは

特定のgitアクションが行われた時に、スクリプトを実行する

1. それぞれがフックが動くタイミングは?

docs.google.com

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自体に無関係なものはフックにしない方がいい。スクリプトにしておけばよかった、、