🤜

Husky から Lefthook への移行時における hooksPath 設定の注意点

に公開

これはなに

Git フックを管理するツールとして広く使われている Husky から Lefthook への移行時に意外とハマりやすいポイントがあります。本記事ではその注意点について解説します。

はじめに結論

Husky から Lefthook に移行する際は、Git フック( pre-commit など)のスクリプトを配置するディレクトリーをリセットすることを強くおすすめします。

背景

Git フックとは、特定の Git コマンドの実行前後に自動的に実行されるスクリプトのことです。たとえば pre-commit フックを使うことでコミット前に lint チェックを実行するといったことが可能になります。

Git フックのスクリプトファイルは、デフォルトでは .git/hooks ディレクトリーに配置されます。しかし Husky は独自の .husky ディレクトリーを作成し、その配下にスクリプトファイルを配置する仕様となっています。

https://typicode.github.io/husky/how-to.html

問題点

Husky を使用しているリポジトリーでは、husky init(もしくは husky)コマンドの実行時に、.git/config ファイルに以下のような設定が追加されます:

.git/config
[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  ignorecase = true
  precomposeunicode = true
+ hooksPath = .husky/_

この設定によって Husky は .git/hooks ディレクトリーではなく、.husky/_ ディレクトリーにあるスクリプトファイルを Git にフックとして登録します。

一方で Lefthook にそのような制約はなく、Git 本来の設定に従います。つまり、特別な設定がない限りはデフォルトの .git/hooks ディレクトリーを参照します。

https://lefthook.dev/usage/commands.html?highlight=.git%2Fhooks#lefthook-add

ここで問題となるのが、Husky から Lefthook へ移行する際に hooksPath の設定を忘れてしまうケースです。この設定を放置したまま lefthook install コマンドを実行すると、.husky/_/ ディレクトリー配下にスクリプトファイルが生成されてしまいます。

  .
+ ├── .husky
+ │   └── _/
+ │       ├── commit-msg
+ │       ├── pre-commit
+ │       └── prepare-commit-msg
  ├── lefthook.yml
  └── package.json

このままでも Lefthook は期待通りに動作しますが、使われていないはずの Husky を連想させるディレクトリーが残り続けるのは、リポジトリーの可読性低下を招くため好ましくありません。

解決方法

hooksPath の設定をリセットします。以下のコマンドを実行することで設定をリセットできます:

git config --unset core.hooksPath

もしくはリポジトリーディレクトリー直下にある .git/config ファイルを直接編集して hooksPath の設定を削除します。

これでパスの設定がリセットされ、Lefthook はデフォルトの .git/hooks ディレクトリーを参照するようになります。lefthook.yml を作成した後に lefthook install コマンドを実行すると、以下のように .git/hooks ディレクトリー配下にスクリプトファイルが生成されます:

  .
  ├── .git
  │   └── hooks
+ │       ├── commit-msg
+ │       ├── pre-commit
+ │       └── prepare-commit-msg
  ├── lefthook.yml
  └── package.json

これで Lefthook の本来あるべき姿を取り戻すことができました。

参考文献

https://git-scm.com/docs/githooks

https://github.com/typicode/husky/issues/893#issuecomment-789365943

Discussion