0
0

More than 1 year has passed since last update.

サブディレクトリでhuskyを使用する

Posted at

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を実行してみてください。)

0
0
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
0
0