huskyのフックがGit GUIクライアントで有効にならない時の対処方法

背景

husky と lint-staged を利用して pre-commit を行っている。

コマンドライン(CUI)でコミットをした際は問題なく pre-commit が走る。SourceTree などの Git GUI クライアントを利用してコミットを行うとフックがスキップされてしまう。(Fork という他の GUI アプリでも同様であった)

実行環境

  • macOS: Mojave, Catalina
  • husky: v4.3.0
  • SourceTree: 4.0.2

原因

husky の v3 系までは問題なかった。v4 系で run-node というモジュールが削除された事が原因のようであった。

v4 系からは、GUI アプリから node のパスが取れないことが問題のようだ(例えば bash の場合、SourceTree から.bash_profile を読み込まないので、node のパスを見つけられない)。

解決方法

検証した解決方法は下記の通り:

  1. husky を v4 から v3 にダウングレードする
    → セキュリティの脆弱性の問題がある
  2. ~/.huskyrc  を用意してパスを追加する
    → 解決が公式見解みたい
  3. stree  コマンド経由でのアプリを立ち上げる(SourceTree であれば)

セキュリティ上の問題がなければダウングレードが手っ取り早い。コマンドラインがメインでたまに GUI を使う程度であれば、GUI ツールの「コマンドラインツールをインストール」して、それ経由でアプリを立ち上げると良い(例えばstreeコマンド)。

~/.huskyrc を用意してパスを追加する

公式リファレンスのトラブルシューティングにも記載がある手法

https://typicode.github.io/husky/#/?id=command-not-found

何のシェルを使っているか分からない場合はecho $SHELLを実行する。使っているシェルによって、~/.huskyrc内にそれぞれ記述する(node のパスがわかれば良い)。

# bash:
echo 'source ~/.bash_profile' >> ~/.huskyrc
# zsh:
echo 'source ~/.zprofile' >> ~/.huskyrc

余談

SourceTree でも議論があるようで将来的に設定をしなくとも解消するかもしれない。

https://jira.atlassian.com/browse/SRCTREE-7184

参考