今まで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
導入方法
- overcommitはRubyGemsを経由してinstallするので事前にrubyの環境を導入してください。
-
gem install overcommit
でovercommitをinstallします。 - git-hookを拡張したいディレクトリ内で
overcommit --install
を実行する。 -
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のチェックを通す場合、以下のような記述を追加します。
PreCommit:
RuboCop:
enabled: true
command: ['bundle', 'exec', 'rubocop']
変更後はovercommit --sign
でこの変更を反映してください。変更後のcommit時の動作が以下のようになります。
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導入
- lint-staged及びhuskyはnpmで管理するので先にnode.jsの環境を導入する必要があります。
-
npm install --save-dev lint-staged husky
でlint-stagedとhuskyをinstallする。 -
package.json
にgit-hookの設定を追加する。
cd project-dir
npm install --save-dev lint-staged husky
hookの設定
lint-stagedのgit-hookの設定はpackage.json
で行います。
例えば、commit時にrubocopのチェックを通す場合、以下のような記述を追加します。
"scripts": {
"precommit": "lint-staged"
},
"lint-staged": {
"*.rb": [
"bundle exec rubocop",
"git add"
]
},
overcommitと違いovercommit --sign
のようなコマンドは必要ありません。
まとめ
今回はgit-hookを拡張するためのovercommitとlint-stagedを使用した感想と導入方法をまとめてみました。
それでは良いコーディングライフを!