読者です 読者をやめる 読者になる 読者になる

checkoutしたタイミングで任意の処理を実行する

前置き

仕事場では、gruntが導入されており、その生成物はバージョン管理の対象外となっています。
そのため、他の人がjsを修正した際に、ブランチを切り替えたあと、"grunt build"を実行しないと、古いjsのまま動かしてしまうことが何度かありました。*1
基本的に、自分ではjsを触らないこともあり、チェックアウトしたタイミングで、自動的に再生成されるようにしました。

手順

まず、チェックアウトされたタイミングで実行したい処理を記述します。
今回は kyouen-python にあるcoffeescriptを自動的にjsに変換する処理を書いてみます。
フォルダ構成としては、
kyouen-python/src/coffee:coffeescriptが保存してある
kyouen-python/src/js:生成されたjsを保存する
といった感じです。
なので、スクリプトは下記のようになります。

cd src/coffee
coffee -c -o ../js list.coffee


これを、"post-checkout"として保存します。(カレントディレクトリは"kyouen-python"の想定)

cd .git/hooks/
echo "cd src/coffee" >> post-checkout
echo "coffee -c -o ../js list.coffee" >> post-checkout
chmod +x post-checkout

あとは、通常通りチェックアウトすると、自動的にlist.jsが生成されます。*2

git checkout feature-XXXX


参考にしたのは下記です。
http://git-scm.com/book/ja/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF

雑感

"post-checkout"だけでなく、いろいろなフックがあるようです。
"pre-"とついたフックを書くことで、commitなどの行動に制約を課すことができるようです。(lintを実行し、エラーだったら拒否するとか)
チームで作業する際に、てきとーなコミットを許さない、とか出来そうですね。*3


.gitディレクトリ以下って、バージョン管理対象外ですよね?
この"post-checkout"ファイルはどうやって管理するのが普通なんだろう。。。

*1:本番・ステージング環境にデプロイするときはJenkinsのタスクに登録されています

*2:coffeeコマンドって、標準出力になにも出さないんですね。動いてるのかわからなかったorz

*3:でも、とりあえずコミットさせて、Jenkinsとかがフックして、違反があったらパトランプが回る、とかの方が面白いかなー