VS Code x lint-staged でエラーが出る場合の解決策


VS Code などの GUI ツールから git コミットをする場合に環境によって lint-staged でエラーが出る場合があります。本記事ではその原因と解決策を紹介します。

問題

lint-staged を使ってコミット時に自動でフォーマットやリントを行っているが、VS Code の GUI からコミットするとエラーとなりコミットに失敗します。エラーメッセージは下記のようなものです。

/usr/bin/env: ‘bash\r’: No such file or directory
husky - pre-commit hook exited with code 127 (error)

ただし、コマンドラインからコミットすれば問題なくコミットできるし、lint-staged も動きます。

原因

VS Code の GUI からコミットする場合は non interactive shell で実行されているため、.bashrc.bash_profileで設定した PATH が読み込まれません。

そのため、その PATH が必要なコマンドを lint-staged で実行している場合はコマンドが見つからないためエラーとなります。

今回の環境では nodejs を nvm で利用している環境で、その PATH は.bashrcで設定していました。

一方で、lint-staged(Husky)では pre-commit コマンド内でnpxコマンドを使っているため、node への PATH がない環境ではエラーとなっていたようです。

解決策

以下の内容のファイルを~/.huskyrcに設置するだけです。

.huskyrc
source ~/.bashrc

解決策の解説

lint-staged は pre-commit の実行を Husky に依存しています。

その Husky は~/.huskyrcがあれば事前にそれを実行してくれます。なので必要な処理をそこに書いていけば OK です。今回は PATH の設定ですが、~/.bashrcを実行することでそれを行っています。

参考情報

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