blog.yuzu441.com

GUIからgitのcommit hookを動かす

自分はgitの操作をする時は基本的にCUIから行っていて、GUIツールはaddする時くらいにしか使っていないので気づかなかったが、core.hooksPathを利用してvscodeのGUIからコミットした時に◯◯ command not found.エラーになってしまうという相談をされたので動かす方法を調べたメモ

動作確認はすべてMacOS Sonoma 14.5で行っています

tl;dr

自分の環境だとvsocdeからはgitcore.hooksPathで設定して(選択肢1のもの)特に何も設定すること無くコミット・コミットフックが動かせたため、動くのであればこれが一番良い。ただsourcetreeだとコミットフックがエラーになったためvscodeが賢いのだと思う

そのため動作しない場合は依存増えてしまうのと、jsのプロジェクトでなければNode.jsからいれる事になってしまうがhusky(選択肢3のもの)を使うのが一番簡単そう

1. 依存が増えないもの

gitcore.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としてログイン時にコマンドを実行するようにすると良いらしい

仕事などで使うにはgitで管理するのも難しく、launchdを自分で管理してくださいも難易度高い気がして採用しなかった

3. huskyで実行する

自分の環境だと相談されたvscodeのgit機能からコミットしてもCommand not foundが発生しなかったため確認できていないが、sourcrtreeでコミットできなかったのがコミットできるようになったのでhuskyも調べる

動作確認用にyuzu-sandbox/commit-hook-checkも用意したので、お手元で試す際はcloneしてもらうと良い

huskyの設定をする

huskyのドキュメントを見てるとCommand not foundの時の記述があった

Troubleshoot | Husky

ドキュメントを読んだ所、以下のどちらかに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/nodebrewnvm-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からコミットするかという結論になりました