Husky から Lefthook への移行時における hooksPath 設定の注意点
これはなに
Git フックを管理するツールとして広く使われている Husky から Lefthook への移行時に意外とハマりやすいポイントがあります。本記事ではその注意点について解説します。
はじめに結論
Husky から Lefthook に移行する際は、Git フック( pre-commit
など)のスクリプトを配置するディレクトリーをリセットすることを強くおすすめします。
背景
Git フックとは、特定の Git コマンドの実行前後に自動的に実行されるスクリプトのことです。たとえば pre-commit
フックを使うことでコミット前に lint チェックを実行するといったことが可能になります。
Git フックのスクリプトファイルは、デフォルトでは .git/hooks
ディレクトリーに配置されます。しかし Husky は独自の .husky
ディレクトリーを作成し、その配下にスクリプトファイルを配置する仕様となっています。
問題点
Husky を使用しているリポジトリーでは、husky init
(もしくは husky
)コマンドの実行時に、.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
ディレクトリーを参照します。
ここで問題となるのが、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 の本来あるべき姿を取り戻すことができました。
参考文献
Discussion