TL;DR
- huskyの実行ファイルはGitの
core.hooksPath
で設定される - Gitにはそもそもhooks機能があり、huskyはその実行ファイルを可視化しているだけ
前置き
husky
と呼ばれる、Gitのあらゆるアクションに付随してコマンドを実行してくれる便利な存在があります。代表的なものはpre-commitでlint等を動かしてくれるものでしょうか。lintはついつい実行し忘れてしまうので、commit前に自動で実行してくれると便利ですよね。
huskyはnpmモジュールなので、基本的にはnodeを使用するディレクトリでinstallすればよしなに使えるようになるのですが、package.json
と.git
を別階層に存在させたい、そんなときもあると思います。例えば、下記のようなディレクトリ構成を持つときです。
$ tree
.
├── back
├── front
│ └── package.json
└── .git
このようなときに、front
ディレクトリでhusky
をインストールすると以下のようになるわけです。
$ tree
.
├── back
├── front
│ ├── package.json
| ├── .husky
| │ ├── _
| │ │ ├── .gitignore
| │ │ └── husky.sh
| │ └── pre-commit
| ├── package-lock.json
| └── package.json
└── .git
frontでhuskyをインストールするときにgitが無いよとか怒られる可能性があるのですが、この場合はgitのあるディレクトリで
$ git config --local --add core.hooksPath front/.husky
と設定してあげると動きます。なぜでしょうか?
そもそも、GitにはGit Hooks機能が存在しています。設定値は
$ git config --local --get core.hooksPath
で確認できます。何もしていなければ設定されていないと思います。(適当なgitディレクトリで試してみてください。)
平易に理解すると、huskyはその設定ディレクトリを変えてあげているだけです。
つまり、huskyをインストールするのすら面倒なときは.git/hooks
に適当なファイルを生成してあげ、core.hooksPath
に.git/hooks
を設定すると動きます。
$ git config --local --add core.hooksPath .git/hooks
$ echo "echo 'hoge'" > .git/hooks/pre-commit
$ git commit --allow-empty --allow-empty-message -m ""
hoge
となるわけです。(もし動かない場合は、chmod +x .git/hooks/pre-commit
を実行してみてください。)