git hooksの始め方


本記事に書かれていること

  • git hooksを使って、スクリプトを実行する設定方法
  • git hooksのスクリプトをgitで管理する方法
  • pythonやrubyでスクリプトを書く方法

hooksスクリプトで実際にやりそうなあれこれのサンプルコードとかはないです。

git hooksでスクリプトを動かしてみる

まずはプロジェクト作成

$ mkdir hooks-sample
$ cd hooks-sample
$ git init

git initした際に、.git/hooks配下にhooksのサンプルファイルが作成されています。
サンプルファイル以外にも命名規則に従ったファイル名でスクリプトを作成しておけば認識してくれます。
pre-commit.sampleを書き換えてcommit前にメッセージが表示されるようにします。
また、hooksスクリプトで拡張子は使えないので、.sampleはファイル名から削除しておきます。

$ cd .git/hooks
$ mv pre-commit.sample pre-commit
$ chmod a+x pre-commit
$ cd ../../

ファイルの中身を書き換えます。

pre-commit
#!/bin/sh
echo "pre-commit message"

適当にファイルを作成してコミットしてみる

$ touch some_file
$ git add -A
$ git commit -m "init"
pre-commit message
[master (root-commit) 2e9222d] init
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 some_file

commitコマンドにトリガーされてcommit前にメッセージが表示されました。

commitさせたくない場合

pre-commitであれば、commit前にlintチェックをしてエラーがあればcommitさせたくないなどあると思います。
スクリプト内でexit 1してあげればcommitを中断することができます。以下のようにpre-commitを修正します。

#!/bin/sh
echo "commitできません"
exit 1

メッセージを表示した後、コード1でexitしているのでcommitが中断されるはずです。

$ touch some_file2
$ git add -A
$ git commit -m "このcommitコマンドは中断されます。"
commitできません
$ git status
On branch master
Changes to be committed:
    new file:   some_file2

無事commitが中断されました。

hooksスクリプトをgit管理したい

ここまで、hooksスクリプトは.git/hooks配下にありました。このディレクトリはgitの管理下にはないのでチームでhooksスクリプトを共有したい場合はこのままでは使えません。
hooksスクリプトを管理するディレクトリを作成し、そのパスをgit hooksのパスとして設定します。

$ mkdir .hooks
$ mv .git/hooks/pre-commit ./.hooks
$ git config core.hooksPath .hooks

これでhooksスクリプトをgit管理に入れて、チームで共有することができました。
git configは各環境で実行してもらう必要があります。READMEにでも書いておけば良いでしょう。

hooksスクリプトでpythonが使いたい

そんな場合は、シバン行をpythonに変えてあげるだけです。
同様にrubyやperlも使えるみたいです。

pre-commit
#!/usr/bin/env python3
print("pre-commit")

終わり

以上、hooksスクリプト使い始めるまでの設定について書きました。
使う機会があれば、各hooksでできそうなこと、やったらよさそうなことについても書きたいと思います。