huskyのフックがGit GUIクライアントで有効にならない時の対処方法
背景
husky と lint-staged を利用して pre-commit を行っている。
コマンドライン(CUI)でコミットをした際は問題なく pre-commit が走る。SourceTree などの Git GUI クライアントを利用してコミットを行うとフックがスキップされてしまう。(Fork という他の GUI アプリでも同様であった)
実行環境
- macOS: Mojave, Catalina
- husky: 4.3.0
- SourceTree: 4.0.2
原因
husky の v3 系までは問題なかった。v4 系で run-node というモジュールが削除された事が原因のようであった。
v4 系からは、GUI アプリから node のパスが取れないことが問題のようだ(例えば bash の場合、SourceTree から.bash_profile
を読み込まないので、node のパスを見つけられない)。
解決方法
検証した解決方法は下記の通り:
- husky を v4 から v3 にダウングレードする
→ セキュリティの脆弱性の問題がある ~/.huskyrc
を用意してパスを追加する
→ 解決が公式見解みたい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
19/May/2023 5:16 PM
Fixed in 4.2.3 release.
https://jira.atlassian.com/browse/SRCTREE-7184
v4.2.3 で修正されたようである。