git pullでファイルに変更があったら特定のコマンドを実行する。

最近ガッツリnode.jsのプロジェクトを行っているんですが、チームで開発しててよくあるのが、git pullした後にpackage.jsonbower.jsonが変更されている事に気づかず、 そのまま起動してしまい、モジュールが足りてなくて動作しないって事です。

多分コレってnode.jsに限らずrubyとかperlとかphpとかpythonとか何でもあると思うんです。もうすぐ、2014年度です、運用でpullしてエラーが出たらnpm install/cpanm/bundle installしましょうとか言うのは辞めましょう。*1

git pullしたら変更されたファイルの一覧から 対象のファイルが変更されているかどうかを認識して、特定のコマンドを自動で実行するためのコマンド、hookinを作りました。

Getting started

npmが入っているなら超簡単で、

$ npm install hookin -g

で入れて

$ cd <project_root>
$ hookin <チェック対象ファイル> <実行コマンド>

ってやれば/.git/hook/post-mergeにチェック対象のファイルとそのファイルが更新された時に実行されるコマンドが記述されます。

例:

$ hookin package.json "npm install && npm prune"
$ hookin bower.json "bower install && bower prune"

作ったらpackage.jsongithub上で変更を入れてみましょう。package.jsonに変更があったら勝手にnpm install && npm prune が実行されます。(.gitフォルダが有ることが前提なので、git initかgit cloneでgit プロジェクトである必要があります。)

CREDITS

hookin を実行すると、.git/hook/post-merge以下に下記のようなファイルを作ります。

#/usr/bin/env bash
#MIT © Sindre Sorhus - sindresorhus.com
# forked by Yosuke Furukawa

#changed_files checker
changed_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"

check_run() {
  echo "$changed_files" | grep --quiet "$1" && eval "$2"
}
# package.json
check_run package.json "npm install && npm prune"
# bower.json
check_run bower.json "bower install && bower prune"


MITライセンスで明記されているように、これの元ネタはsindresorhusがgistに投稿してた以下のスクリプトから派生したものです。

https://gist.github.com/sindresorhus/7996717

@sindresorhus++

*1:もしかしたら僕の知らない既に発明された対策があるのかもしれないので、そういう場合は遠慮なく教えて下さい。

*2:名前の由来は腹筋から取りました。

git使ってて便利だった拡張3つ。

gitを今の開発でガッツリ使うようになってすげー便利だと思った拡張を3つ紹介します。

もうね、これらなしではgit使えない。せっかくなので、導入方法と一緒に簡単な使い方も紹介します。

git-completion

f:id:yosuke_furukawa:20130226030925p:plain

gitの補完ツール。
コマンドラインに現在のブランチ名が出る。だけじゃなくて、タブで補完までしてくれる。

導入方法


以下の方法でスクリプトをダウンロードしてきます。

$ mkdir -p /usr/local/git/contrib/completion/; cd /usr/local/git/contrib/completion/
$ curl https://raw.github.com/git/git/master/contrib/completion/git-completion.bash > git-completion.bash
$ curl https://raw.github.com/git/git/master/contrib/completion/git-prompt.sh > git-prompt.sh
$ chmod +x git-completion.bash
$ chmod +x git-prompt.sh

そしたらbashrcとかにこのスクリプトを読み込むようにしておきます。

$ cd ~
$ vim .bashrc

bashrc内

# git settings
source /usr/local/git/contrib/completion/git-prompt.sh
source /usr/local/git/contrib/completion/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[1;32m\]\u@\h\[\033[00m\]:\[\033[1;34m\]\w\[\033[1;31m\]$(__git_ps1)\[\033[00m\]\$ '

そしたらsourceで反映させてください。ちなみにexport部分は色を付けているだけなので、なくても問題はありません。
ただ色が付いているといろいろ捗るだけです。

$ source ~/.bashrc

使い方


.gitが存在する場所に行けば現在のブランチが見えていると思います。
他にもタブでブランチを保管することができるようになります。

f:id:yosuke_furukawa:20130228202316p:plain

ちょっと文字が明るいとか色が被って見づらいって時は、bashrcの32mとか34mとか書いてある部分をいじれば色を変えることができます。
エスケープシーケンス表が乗っているところを参考に変えてみてください。

参考にしたサイト:MacのターミナルでGitのブランチ名を表示する - アインシュタインの電話番号☎

tig


tigも便利。tigなしでは正直history見たりするの厳しい。手頃だし。

導入方法


こっちはもっと簡単。Homebrew が入っていれば入れるだけ。

$ brew install tig

Homebrew入っていないって人はportsでも入れられると思います、が、未検証。
こことか参考にしてみてください。
gitをブラウズするのに最適な「tig」をMacportsから入れてみた at HouseTect, JavaScriptな情報をあなたに

使い方


gitリポジトリ内でtigって打つだけ。

$ tig

これだけで、historyが一覧される。
f:id:yosuke_furukawa:20130228203813p:plain

vimと同じく 'j', 'k'で移動もできます。
Enterを押せばコミットの詳細もみれます。

f:id:yosuke_furukawa:20130228204226p:plain

詳細から一覧に戻るには 'q' を押すだけ。

他にも便利な使い方としては、blameするとき。

よくあるケースとして、

「おい、このコード誰が書いたんだよ!!」

って言われる時ありますよね、その時に無罪を証明するために "tig blame" を使いましょう。綺麗に色付けされます。(普通のgit blameでもいいんだけど、色がついてなくて見難い。)

$ tig blame <FILENAME>

f:id:yosuke_furukawa:20130228204655p:plain

あと、tig statusもgit statusを色付けして表示してくれる上に、'u'ってやるだけでstage/unstageを切り分けられる。

fugitive.vim


これはそこまで酷使してないけど、vim上でgitの状況知る時に便利。

導入方法


NeoBundle使っている人は、以下の行を追加して、NeoBundleInstallってやるだけです。

NeoBundle 'tpope/vim-fugitive'

他のplugin管理ツールを使っている人はgithubから取ってくるなりして導入してください。
tpope/vim-fugitive · GitHub

使い方


vimで開いた状態でvim commandを打って使用する。自分がよく使うのは以下の3つくらい。vimを開いた状態から使いたい場合にだけ使用する。

:Gstatus
git statusをvimのウィンドウに開く。

:Gread
現在開いているファイルをコミット直前の状態に戻す。いわゆる git checkoutする。ただし、実行直後はバッファに反映されるだけでファイルは変更されない。

:Gblame
git blameする、これも色がついていていい感じになる。