2022年9月21日水曜日

Homebrew と git fsmonitor の相性が悪かったので対策した

Git 2.37.0 で FSMonitor daemon が追加されたことで status が早くなったそうです
この記事で fsmonitor の事書いてしばらく使っていたのですが、brew upgrade したときにたまに以下のエラーで失敗するようになってしまいました。

Error: Another active Homebrew update process is already in progress.
Please wait for it to finish or terminate it to continue.

これは Homebrew 3.5.7 で対応されたので、現在は発生しなくなっていると思います。

当時はあんまり調べる時間なかったので、一旦 fsmonitor を無効にしてましたが、修正 PRIssue をみた感じ fsmonitor が homebrew の lock ファイルを掴んでしまうからみたいです。

Homebrew 3.5.7 は fsmonitor を stop させる対応となっていますが、そもそも監視しておくメリットってあるのかな?ということで、 brew 配下だけ fsmonitor を無効にする設定を紹介します。

ちなみに brew に追加する tap も git なのでそれらも無効にします。

includeIf を使って任意のディレクトリ以下の git config をカスタムする

グローバル設定は false で使いたいディレクトリだけ true にするとか、brew 配下のワーキングディレクトリすべてに git config core.fsmonitor false していけばいい話ではあるのですが、デフォルト true で使いたい&一括 false 設定をしたいです。

そこで、includeIf を使います。

includeIf はその名の通り、条件を満たした場合のみ config を include する機能です。
リンク先のドキュメントに Example があるのでどういうことができるのか想像できると思います。

今回は brew --prefix のパス以下の場合に fsmonitor = false にした config ファイルを読み込ませます。
(brew --prefix に合わせて適宜変更してください)


これだけです。簡単ですね。
includeIf 使うと特定のディレクトリ以下で user 切り替えるとかもできるので覚えておくと良いテクニックだったと思います。

おまけ

https://github.com/jgavris/rs-git-fsmonitor

これはたまたま見つけたデフォルトの fsmonitor の hook スクリプトを Rust rewrite したやつ。
fsmonitor って true/false ではなくて hook スクリプトを指定することもできるんですね。

git status がもっと速くなるみたいですよ。
(筆者環境では差は感じられなかった)



0 件のコメント:

コメントを投稿