Open7

Gitの操作時にコマンドを実行できるlefthookを試してみる

kurehajimekurehajime

共同開発をしていると

git pull → 動かなくなった! → npm iしてないだけだった。

みたいな事が多々あるので、そういうのを無くしたい。
lefthookというツールを使うとgit hookの仕組みを言語を横断していろいろできるみたいなので、試してみる。

kurehajimekurehajime

フロントエンドのプロジェクトにインストール

今回はフロントエンドのプロジェクトにインストールする。
rubyのnodeのパッケージが用意されていて、それ以外の言語でもbrewなりsnapなり使えるらしい。

npm i -D  lefthook

lefthookはgoで書かれてるけど、これで適切なバイナリが入る。

kurehajimekurehajime

Hookを追加しておく

今回やりたいのは「git pullした時に」「npm installしたい」なので、post-mergeを指定する。

lefthook add post-merge

(後でわかったが、npm installでもHookが反映されるので、この作業は他のチームメンバーには必要なさそうだった)

kurehajimekurehajime

設定ファイルを用意する

今回やりたいのは「git pullした時に」「npm installしたい」なので、これ。

lefthook.yml
post-merge:
  commands:
    package-install:
      run: npm i
kurehajimekurehajime

【実験】ローカルのソースを消してリポジトリをcloneし直す

  1. Hookの設定をいったんcommit & pushしておく
  2. ローカルのソースを削除する
  3. もう一度ソースをcloneする
  4. npm installする
  5. 別のマシンで適当にファイルを修正してcommit & push
  6. git pullしてみる

この手順を行ったところ、git pullのあとでちゃんとnpm installが走った。

チーム開発では他のメンバーに特に準備をしてもらう必要はなさそう。

kurehajimekurehajime

おまけ

コマンドをこのように書いておけば、package.jsonが変わった時のみnpm installできる。
ただWindowsユーザーへの配慮など考えるとちょっと厄介。

(git diff 'HEAD@{1}' --name-only | grep package.json > /dev/null) && npm i || :

原典はこの記事

kurehajimekurehajime

所感

便利だけれども、git操作に副作用を持たせるというのは若干抵抗がある。
hooksはれっきとしたgitの標準機能なのだから気にせず使えば良いとも言えるけど、仕組みを知らない人は多分びっくりする。
悩ましいところ。