以前から利用していたhusky v4のhooksが実行されない

2021-10-07

業務で利用している husky のバージョンは 4.3.0 。5系はライセンスの問題でアップデートできなかったが、現在は7系でその問題も解消されたので7系にアップデートするを推奨する。あくまで一時的な対応として残しておく。

環境

  • husky 4.3.0

遭遇した問題

pre-commit , pre-push などリポジトリに設定したhooksが実行されない。

結論

gitの変数 core.hooksPath を削除する。

# これで core.hooksPathも削除される
npx husky uninstall

または、gitの設定を変更する。

git config --unset core.hooksPath

調査したときのログ

ざっくりとした理解だが、huskyはgithookを利用してコミット前、プッシュ前などのアクションで対応したファイルが実行される。 デフォルトでは .git/hooks ディレクトリにある pre-commit , pre-push などのアクション名に対応したファイルが実行される。

.git/hooks 配下には今回リポジトリで設定していた pre-commit が存在しているので確認すると .git/husky.sh を実行していた。

% bat .git/hooks/pre-commit
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: .git/hooks/pre-commit
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1#!/bin/sh
   2# husky
   34# Created by Husky v4.3.0 (https://github.com/typicode/husky#readme)
   5#   At: 2021/10/7 11:26:24
   6#   From: ~/work/github.com/repo1/node_modules/husky (https://github.com/typicode/husky#readme)
   78. "$(dirname "$0")/husky.sh"
───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

.huskyも存在している。

% ls .git/hooks
applypatch-msg  husky.local.sh  post-applypatch  post-commit  post-rewrite  pre-applypatch  pre-commit        pre-push    prepare-commit-msg  sendemail-validate
commit-msg      husky.sh        post-checkout    post-merge   post-update   pre-auto-gc     pre-merge-commit  pre-rebase  push-to-checkout

huskyの設定は問題なさそうなのでhuskyの生成したファイル自体が実行されていなさそう。 githooksのドキュメントを確認すると core.hooksPath を設定することでhooksのディレクトリを変更できる。

By default the hooks directory is $GIT_DIR/hooks, but that can be changed via the core.hooksPath configuration variable

.git/config を確認すると hooksPath.husky が設定されていた。

% bat .git/config
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: .git/config
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1[core]
   2   │     repositoryformatversion = 0
   3   │     filemode = true
   4   │     bare = false
   5   │     logallrefupdates = true
   6   │     ignorecase = true
   7   │     precomposeunicode = true
   8   │     hooksPath = .husky
───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

core.hooksPath の設定をなくし(直接ファイルから削除してもいい)、commitすると以前と同じようにhooksが実行された。

% git config --unset core.hooksPath
% git commit
husky > pre-commit (node v14.17.6)
✔ Preparing...
⚠ Running tasks...

同じ状況を再現するには

npx husky install

npxでhusky installを実行した場合4系の設定が反映されない。 core.hooksPath を設定するのはgithooks v2を利用するようになったv5以降。v4を利用しているためデフォルトの .git/hooks 配下のファイルを実行して欲しいが、core.hooksPath にhuskyの生成する独自ディレクトリが指定される。設定自体はv4のままなので参照先に設定ファイルは存在せず、hooksが実行されていないような挙動となっていた。


Web系ソフトウェアエンジニアの備忘録

Contact: 3982ne@gmail.com