Gist で .git/hooks を管理する
個人的な開発の仕方として Rails を使った開発をするときは、そのコードの品質を保つために コミット のタイミングで rubocop の構文チェックを走らせるというスタイルで開発をしています。
プッシュ時だと編集量によっては多すぎるし、ファイル編集中は実装に集中したいということもあり、このタイミングが自分てきにちょうどいい区切りになってます。
しかし、この運用を続けていて、個人的な不満としてあるのが、
プロジェクト を作成する度に、.git/hooks
を作成しないといけない
という問題です。
このめんどくささ故に、時々うっかり rubocop をし忘れてしまいます。
大きなプロジェクトであれば、CIサービスを利用するなどで防げるのですが、 そこまで大きなプロジェクトじゃない、ちょっと試しに作ってみよう系の場合は手を抜き気味。
なので、なんとかサクッと .git/hooks
を設定する方法はないかなーと考えたところ、
gist で hooks を管理する
という運用方法を思いつきました。
コマンド一発で .git/hooks をインストール
管理対象の .git/hooks
一式は、以下のように gist で作成しておきます。
あとは、なんと以下のコマンドを呼ぶだけ!
$ curl -sL https://gist.github.com/kei-p/c00972b403e467f952c6e74bee9774ad/raw/git_hooks_installer | sh
すごい楽!
しかも、gist 自体は git で管理されてるから、メンテしやすい!
仕組み
仕組みはかなり単純で、 .git/hooks
で扱うファイル一式を gist に登録し、
そのインストール作業を git_hooks_installer
として作成してあるのです。
#! /bin/sh # Usage: # $ curl -sL https://gist.github.com/kei-p/c00972b403e467f952c6e74bee9774ad/raw/git_hooks_installer | sh if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then cd `pwd`/`git rev-parse --show-cdup` fi hook_files="utils pre-commit pre-push" for file_name in $hook_files do dst=".git/hooks/$file_name" curl -L -O https://gist.github.com/kei-p/c00972b403e467f952c6e74bee9774ad/raw/$file_name > $dst 2> /dev/null chmod +x $dst echo "install $dst" done
それを、curl で引っぱってきて、 sh のコマンドとして実行させる。
$ curl -sL https://gist.github.com/kei-p/c00972b403e467f952c6e74bee9774ad/raw/git_hooks_installer | sh
ただ、それだけ! それだけのシンプルな仕組み。
でも、それだけなのに、すごい楽w
さいごに
この $ curl -sL
ですが、このテクニック自体は、 dotfiles や brew のインストールなんかに扱われてるテクニックです。
どこかアドレスさえ特定できれば、ファイルをダウンロードして実行することで気軽に複数行にも渡るコマンドを実行できるので、かなり楽です。
あとは、気軽にインストールのコマンドの URL が割り当てることができる、Gist を使っておうという発想でこのスタイルに行き着きました。
導入がかなり楽になり、これからの Ruby コーディングが楽しくなりそうですw