15
3

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 1 year has passed since last update.

huskyのpre-commitがSourceTreeからだと失敗する問題の解決方法

Posted at

この記事は、and factory.inc Advent Calendar 202212日目 の記事です。
昨日は、@y-okuderaさんの「スクロールで伸縮するヘッダをSwiftUIで実装する」でした。

はじめに

コミット時にLintを走らせるなど便利なhuskyですが、弊社でも一部のプロダクトで使用することにしました。
私は普段SourceTreeを使っていますが、コミット時にhuskyのpre-commitが失敗するので解決方法を調べてみました。
ちなみに、ターミナルからコミットをする分には問題ありませんでした。

huskyのバージョンは、Ver.8.0.1です。

エラー内容

SourceTreeからコミットしようとすると、以下のようなエラーが発生してコミットすることができません。

git -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree commit -q -F /var/folders/c0/ty42hdr5071fg0zqy1xc3mxh0000gn/T/SourceTreeTemp.1mJRN4 
.husky/pre-commit: line 4: npx: command not found
husky - pre-commit hook exited with code 127 (error)
husky - command not found in PATH=/Applications/Sourcetree.app/Contents/Resources/git_local/libexec/git-core:/Applications/Sourcetree.app/Contents/Resources/bin:/Applications/Sourcetree.app/Contents/Resources/git_local/bin:/Applications/Sourcetree.app/Contents/Resources/git_local/gitflow:/Applications/Sourcetree.app/Contents/Resources/git_local/git-lfs:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Completed with errors, see above

npx が見つからないというエラーメッセージで、実際に PATH= 以降に表示されているパスを確認してもそれっぽいパスはありません。
しかし、ターミナルからは見つかりました。

$ which npx
/Users/[ユーザー名]/.nodebrew/current/bin/npx

ターミナルからのコミットは問題ないことからも、SourceTreeとターミナルとでは環境変数に差があるようです。

解決方法

予想通りとは思いますが、 npx へのパスを通してあげることで解決します。

ホームディレクトリに .huskyrc を作成し、そこにnpxへのパスを通せば問題ありませんでした。

$ echo "export PATH=\"$(dirname $(which npx)):\$PATH\"" > ~/.huskyrc

参考:https://github.com/typicode/husky/issues/390#issuecomment-762213421

  • npx がどこにあるのかを探して、(which npx)
  • ディレクトリ名を表示し、(dirname)
  • export文を、(echo "export PATH〜〜〜")
  • ~/.huskyrc に出力する。(> ~/.huskyrc)

イシューのコメントでもいくつか投稿されていましたが、単純に以下の指定をしても私の環境ではそのパスにはnpxはないのでうまくいきませんでした。

.huskyrc
PATH="/usr/local/bin:$PATH"

なぜホームディレクトリに.huskyrcを置くと大丈夫なの?と思われるかもしれませんが、pre-commitのタイミングでhusky.shを実行しており、そこで以下の指定がされている為だと思います。

  if [ -f ~/.huskyrc ]; then
    debug "sourcing ~/.huskyrc"
    . ~/.huskyrc
  fi

ここを改造すれば、.huskyrcの置き場所はホームディレクトリじゃなくてもいけるかもしれませんね。

最後に

エラーが発生しているメンバーもいれば、そうでないメンバーもいるようでした。
また、nvmを使用している場合はnvm.shを実行すると良いというようなイシューのコメントも見かけましたので、各自の開発環境に大きく依存しているんだなと感じています。

特定のプロジェクトの為に、ホームディレクトリにファイルを置くのはちょっとモヤモヤしますが。。。
ある程度大きな規模のプロジェクトになると非エンジニアのかたもGitを操作するようなシーンもあると思いますので、この方法は取りにくいかもしれませんが、あくまで仮の対策という感じで考えていただければと思います。

明日のAdvent Calendarの記事もお楽しみに!:santa:

15
3
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
15
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?