2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

git-hookを使いやすくするツール紹介

Last updated at Posted at 2018-09-14

今までovercommitを使ってきましたが、lint-stagedも良いよと紹介されたので実際使ってみた感想とovercommitと違うと思った点、導入方法までメモとして残しておきます。

結論

  • commitなどのレスポンス速度はovercommitよりlint-stagedの方が早い。
  • overcommitはオプションのプリセットが豊富、対してlint-stagedは自分でオプションを作る必要がある。
  • overcommitは既存のgit-hookと共存できない、対してlint-stagedは既存のgit-hookと共存できる。

以上から、初めてgit-hookを使う人はovercommitがおすすめだと思います。対してgit-hookに慣れている人はlint-stagedをおすすめします。

overcommit

git-hookの機能の設定をするためのRuby製のツールです。
https://github.com/brigade/overcommit

導入方法

  1. overcommitはRubyGemsを経由してinstallするので事前にrubyの環境を導入してください。
  2. gem install overcommitでovercommitをinstallします。
  3. git-hookを拡張したいディレクトリ内でovercommit --installを実行する。
  4. overcommit --signで署名をします。(不正な変更を防ぐため)
cd project-dir
gem install overcommit
overcommit --install
overcommit --sign

ディレクトリ内のovercommitを無効にする場合、

overcommit --uninstall

このとき、.overcommit.ymlは残るので不要なら削除してください。

hook(pre-commit)の設定

overcommitのgit-hookの設定は.overcommit.ymlで行います。
例えば、commit時にrubocopのチェックを通す場合、以下のような記述を追加します。

.overcommit.yml
PreCommit:
  RuboCop:
    enabled: true
    command: ['bundle', 'exec', 'rubocop']

変更後はovercommit --signでこの変更を反映してください。変更後のcommit時の動作が以下のようになります。

.overcommit.yml変更後
git add sample.rb
git commit -m "commit message"
# ここでbundle exec rubocop sample.rbのチェックが入る。
# rubocopがpassすればコミットもpassします。
# rubocopがrejectすればコミットもrejectされます。

rubocop以外にもovercommitには設定できるlintやコミットメッセージのチェックオプションなどが数多くあります。公式のドキュメントは多機能にかかわらずわかりやすいので気になった方は覗いてみてください。

lint-staged

git-hookを設定しやすくするツールです。現在はhuskyとセットで使うことを推奨しているようです。
https://github.com/okonet/lint-staged

lint-staged導入

  1. lint-staged及びhuskyはnpmで管理するので先にnode.jsの環境を導入する必要があります。
  2. npm install --save-dev lint-staged huskyでlint-stagedとhuskyをinstallする。
  3. package.jsonにgit-hookの設定を追加する。
cd project-dir
npm install --save-dev lint-staged husky

hookの設定

lint-stagedのgit-hookの設定はpackage.jsonで行います。
例えば、commit時にrubocopのチェックを通す場合、以下のような記述を追加します。

package.json
"scripts": {
	"precommit": "lint-staged"
},
"lint-staged": {
	"*.rb": [
		"bundle exec rubocop",
		"git add"
	]
},

overcommitと違いovercommit --signのようなコマンドは必要ありません。

まとめ

今回はgit-hookを拡張するためのovercommitとlint-stagedを使用した感想と導入方法をまとめてみました。
それでは良いコーディングライフを!

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?