LoginSignup
0
2

More than 1 year has passed since last update.

[Rails] pre-commitの導入に触れてみた

Posted at

はじめに

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 時にコーディングチェックを行う

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2