Gitのpost-checkoutフックを使ってみた
2018-10-18
TechGitのpost-checkoutフックを使って、ブランチを切り替えたときにWIPコミットがあればメッセージを出すようにしてみたという話。
WIPコミットとは
WIPコミットというのは個人的な名称だが、全ての変更を仮コミットにまとめたものをそう呼んでいる。例えばブランチで新機能を開発している最中にバグを見つけてmasterを触らないといけなくなった時は、git commit -am 'WIP'
でWIPコミットを作ったあとmasterに移動する。
バグ修正を終えてmasterから戻ってきたあとは、git reset HEAD^
とするとWIPコミットが削除され、作業中の状態に戻すことができる。
作業状態の保存はgit stash
でもできるが、stashの場合は「このブランチにはWIPがある」ということは自分で覚えておかないといけない。一方WIPコミットはブランチに紐づくので、ブランチをcheckoutしたあとgit logすればWIPがあったことを思い出せる。
WIPコミットの注意点
…のだけど、たまにそのgit log自体を忘れて、WIPコミットがあるのに気づかずにその上にコミットを乗せてしまうことがあった。(WIPコミットはあくまで作業状態を保存するためのもので、ソースを読む人にとっては意味のない単位なので、git push
する前には消しておきたい。)
これを避けるために、git checkout
したあとWIPコミットがあれば警告を出すようにしてみた。手順は以下。
.git/hooks/post-checkout
というファイルを作成chmod +x .git/hooks/post-checkout
- 以下のように書く
#!/usr/bin/env ruby
out = `git log -n 1 --pretty=oneline`
out =~ /\A(\w+) (.*)\n\z/
ref, msg = $1, $2
if msg == 'WIP'
puts "このブランチにはWIPがあります"
end
こうすると、git checkout
するたびに以下のスクリプトが動いてWIPコミットがあるかどうかチェックしてくれる。