git hookを使ってみた

gitのhookを使ってみた

fukajun

背景

ruby 1.9から次のようなhashは


  { :a => 1, :b => 2 }

こんな感じにより、一般的なハッシュぽく書ける


  { :a: 1, b: 2 }

みんなもうとっくに新しい書き方に移行したよね?

でもついつい癖で 古い書き方をしてしまって、それをgitにコミットしてしまう

目的

自分の癖のために、コーディング規約に沿ってない書き方のコードでプルリクしてしまうことを防ぎたい

どうしたか?

git フックを使ってみました

git hook?

  • 各リポジトリの.git/hooksディレクトリのなかにあるスクリプトファイル、下記のような名前のファイルが含まれてる
applypatch-msg.sample    post-update.sample
pre-commit.sample    prepare-commit-msg.sample
commit-msg.sample  pre-applypatch.sample
pre-rebase.sample     update.sample
  • patch、commit、rebase、mergeなどのタイミングで任意の動作を行うことができる
  • shell, ruby, perl その環境で動くものならどの言語でも書ける

いろいろなhookのタイミング

  • フックはいろいろある
    • クライアント側
    • サーバー側

https://www.kernel.org/pub/software/scm/git/docs/githooks.html

applypatch-msg pre-applypatch post-applypatch pre-commit prepare-commit-msg commit-msg post-commit pre-rebase post-checkout post-merge pre-receive update post-receive post-update pre-auto-gc post-rewrite_

作り方

  • .git/hooksのしたに.sampleがついたファイルがあるので内容を編集する
  • 動かしたいものは.sampleを外した名前に変更しておく
  • 環境で動くものなら任意の言語(bsh, bash, ruby,perl, python)で書ける
  • 処理の戻り値で動作を中止することができたりする
    • 例えば、pre-commitなら0以外を返すとコミットを中止できる
    • git commit --no-verify を利用するとフックは使用されなかったり

実際に作ってみた

古いスタイルのハッシュを書いていたらコミット 中止

#!/bin/sh
# .git/hooks/pre-commit
git diff --cached | grep ":[^ ]*  *=>  *:[^ ]*"
result=$?
ret=0
if [ $result -eq 0 ]; then
  echo "!!!!!!!!Include old type hash statement!!!!!!!"
  ret=1
fi
exit $ret

デモ

ここでコマンドラインで動かしてデモ

まとめ

  • 今回はshellを利用したけど、普通に書くだけでチェック処理を作れる
  • 戻り値を、0:成功, 0以外:失敗とするだけで制御できる
  • レビューで指摘することが多いことは、自動化すると良いかも
  • 今回の実際のコード