kei-p3’s blog

kei-pによる技術共有と思考整理

Gist で .git/hooks を管理する

個人的な開発の仕方として Rails を使った開発をするときは、そのコードの品質を保つために コミット のタイミングで rubocop の構文チェックを走らせるというスタイルで開発をしています。

プッシュ時だと編集量によっては多すぎるし、ファイル編集中は実装に集中したいということもあり、このタイミングが自分てきにちょうどいい区切りになってます。

しかし、この運用を続けていて、個人的な不満としてあるのが、

プロジェクト を作成する度に、.git/hooksを作成しないといけない

という問題です。

このめんどくささ故に、時々うっかり rubocop をし忘れてしまいます。

大きなプロジェクトであれば、CIサービスを利用するなどで防げるのですが、 そこまで大きなプロジェクトじゃない、ちょっと試しに作ってみよう系の場合は手を抜き気味。

なので、なんとかサクッと .git/hooks を設定する方法はないかなーと考えたところ、

gist で hooks を管理する

という運用方法を思いつきました。

コマンド一発で .git/hooks をインストール

管理対象の .git/hooks 一式は、以下のように gist で作成しておきます。

kei-p/git_hooks_installer

あとは、なんと以下のコマンドを呼ぶだけ!

$ 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 ですが、このテクニック自体は、 dotfilesbrew のインストールなんかに扱われてるテクニックです。

どこかアドレスさえ特定できれば、ファイルをダウンロードして実行することで気軽に複数行にも渡るコマンドを実行できるので、かなり楽です。

あとは、気軽にインストールのコマンドの URL が割り当てることができる、Gist を使っておうという発想でこのスタイルに行き着きました。

導入がかなり楽になり、これからの Ruby コーディングが楽しくなりそうですw