GUIからgitのcommit hookを動かす
tags: javascript
自分はgitの操作をする時は基本的にCUIから行っていて、GUIツールはaddする時くらいにしか使っていないので気づかなかったが、core.hooksPathを利用してvscodeのGUIからコミットした時に◯◯ command not found.エラーになってしまうという相談をされたので動かす方法を調べたメモ
動作確認はすべてMacOS Sonoma 14.5で行っています
tl;dr
自分の環境だとvsocdeからはgitのcore.hooksPathで設定して(選択肢1のもの)特に何も設定すること無くコミット・コミットフックが動かせたため、動くのであればこれが一番良い。ただsourcetreeだとコミットフックがエラーになったためvscodeが賢いのだと思う
そのため動作しない場合は依存増えてしまうのと、jsのプロジェクトでなければNode.jsからいれる事になってしまうがhusky(選択肢3のもの)を使うのが一番簡単そう
1. 依存が増えないもの
gitのcore.hooksPathを利用して、.githooksなどのディレクトリにフックを設定する方法
git config --local core.hooksPath .githook
これで.githooks/pre-commitなどのファイルを配置してchmod +x .githooks/pre-commitなどとして実行できるようにしておけば、git commit時にpre-commitフックが動いてlint-stagedなどと組み合わせてフォーマットなりができる
この方法で設定してguiで動かす方法があればそれが理想だと思うが見つけられなかった。ただ自分の環境だとvscodeからなら普通にコミット可能だった
2. GUIのアプリの起動時にPATHを設定するようにする
このあたりを読むとMacOSだとlaunchctlコマンドを利用することで、PATHを設定することができるらしい。
macOSでGUIアプリの環境変数を設定する方法探求 #launchd - Qiita
ただ再起動したりするとリセットされるのでlaunchdとしてログイン時にコマンドを実行するようにすると良いらしい
- Macの「ターミナル」でのlaunchdを使ったスクリプトの管理 - Apple サポート (日本)
- macでの定期実行はcronじゃなくてlaunchdを使う - $shibayu36->blog;
- MacOSのデーモンをマスターしよう:Launchdプロセス #MacOSX - Qiita
仕事などで使うにはgitで管理するのも難しく、launchdを自分で管理してくださいも難易度高い気がして採用しなかった
3. huskyで実行する
自分の環境だと相談されたvscodeのgit機能からコミットしてもCommand not foundが発生しなかったため確認できていないが、sourcrtreeでコミットできなかったのがコミットできるようになったのでhuskyも調べる
動作確認用にyuzu-sandbox/commit-hook-checkも用意したので、お手元で試す際はcloneしてもらうと良い
huskyの設定をする
huskyのドキュメントを見てるとCommand not foundの時の記述があった
ドキュメントを読んだ所、以下のどちらかにinit.shファイルを配置して、How To | Husky のように使用したいコマンドのパスを通すと実行できそう
$XDG_CONFIG_HOME/husky/init.sh~/.config/husky/init.sh
自分の場合は XDG Base Directory - ArchWiki を設定しているので、$XDG_CONFIG_HOME/husky/init.shに以下のように記述して、huskyを利用することにした
export VOLTA_HOME="$HOME/.local/share/volta"
export PATH="$VOLTA_HOME/bin:$PATH"
node.jsの管理はVoltaを使用していて、その記述なのでhokaccha/nodebrewやnvm-sh/nvmなど他のツールを使用している人はそれに合わせて記述してください
まとめ
huskyの依存が増えたものの一応GUIでコミットフックを動かす事ができた。ただ特定のパスに$PATHの設定を書く必要があるので地味に面倒だけど、launchdで管理するよりはパスを通す方が簡単に思えるので、README.mdなどにパスの設定して欲しいことを書いておくだけでいいことを考えるとhuskyが妥協点かもしれない
今回の動作確認で久しぶりにGUIからコミットしたけど--fixupでどうやってコミットするのかがわからず、git addも最近はextrawurst/gitui: Blazing 💥 fast terminal-ui for git written in rust 🦀で困ってないので、自分は大人しくteminalからコミットするかという結論になりました