#はじめに
rubocopを扱う際に、pre-commitを導入すると便利だったので確認の意味も込めて情報を整理する。
#pre-commitとは
前提に、Gitには「特定のアクションが発生した時にカスタムスクリプトを叩く方法(フック)」がある。この方法は下記の2つのグループに分けられ、それぞれ実行するものである。
-
クライアントサイドの場合
-
コミットの操作の際に実行
-
マージの操作の際に実行
-
サーバーサイドの場合
-
プッシュされたコミットの受け取りの際に実行
pre-commitは複数あるフックの中の1つで、クライアントサイド側で設定するフックである。
#pre-commitの期待される動作
「コミットメッセージが入力される前に実行されるフック」である。
####主な目的は「何かしらのコードを検査する」ことにある。
- 今からコミットされるスナップショットを検査する。
- 忘れた操作がないか確認する。
- テストが実行できるか確認する。
このフックがゼロでない値を返す時、コミットを中断させることもできる。
#導入方法
まずはシステム全体にインストール
gem install pre-commit
Gemfileに記述
gem "pre-commit", require: false
#導入場所
フックは、.git/hooks/
に格納されている。
git init
で新しいリポジトリを初期化する時には、Gitに同梱されているスクリプトのサンプルがhooksディレクトリに格納される。
サンプルは全てシェルスクリプトで書かれており、一部parlも使われている。
どんなスクリプトでも実行可能かつ適切に命名されていれば問題なく動作する。RubyでもPythonでも記述可能。
フックスクリプトを使用する場合、ファイル名の末尾が.sample
となっているのでリネームして外してしまう。
.git/hooks/pre-commit
となっていれば、自動的に実行されるようになる。
#実装方法
今回はコミットした際にrubocopコマンドを自動実行させる。
rubocopの導入については省略
bundle install
# 対象レポジトリにgit/hooks/pre-commitファイルを作成
bundle exec pre-commit install
#bundler経由でpre-commitを実行
git config pre-commit.ruby "bundle exec ruby"
#git commit 時にrubocop が呼び出される
git config pre-commit.checks "rubocop"
これでコミットする直前にrubocop
コマンドが自動実行されるようになる。
コミットが中断された場合は、指摘された場所を修正すれば問題なくコミットされるはず。
##参考もと
Gitフック
jish/pre-commit
【Ruby on Rails】rubocop と pre-commit を利用して git commit 時にコーディングチェックを行う