git v2.29 で追加された git-maintenance について

git-maintenance とは

git maintenance は、Git 2.29 で導入されたリポジトリのメンテナンス機構です。

porcelain command (高レベル API) *1 ですね。

従来の git gc と似ていますが、ユーザー入力をブロックしないし、適切にロック処理も行っているので、より安全で継続的な運用を意識した設計になっています。

github.com

git gc は今すぐ git maintenance run --task gc に置き換えられる。二重に動いてもロックされているので安全。っぽい。

git-maintenance の基本

  • git maintenance register すると .gitconfig に記録される
  • git maintenance start すると cron に登録される
    • Mac の場合は launchctl の plist
    • 登録された repository について、 git maintenance run --schedule=xxxly する
  • git config maintenance.strategy によって動作が変わる

hourly で prefetch するの面白い。変化が大きい && 自分がよく見るリポジトリだと待ち時間が減って便利かも。

strategy は v2.52 から geometric が増えるっぽいです。これは incremental-repack じゃなく git repack --geometric する戦略。Scaling monorepo maintenance - The GitHub Blog にあるように、大きな monorepo だと geometric の方が効果があるのかもしれない

git maintenance は普段から動いている

tech.mobilefactory.jp

git maintenance は、リポジトリへの書き込み操作(fetch、commit、merge、rebase など)の後に自動的に実行される最適化処理です。リポジトリのパフォーマンスを維持するために、不要なオブジェクトの削除やパックファイルの再編成を行います。

.git を更新する処理の前後で自動で走っています。

git-maintenance を有効にする (git maintenance register) と、cron で更新するようになるので git fetch 時に動かす必要が無いとして maintenance.auto = false になります。

感想

prefetch は使いどころがあるのかもしれない。

いやー、どうだろうな。ラップトップ PC で git maintenance register する意味があるかというと微妙な気がする。テザリングしている最中に .git 更新されても嬉しくはなさそうだし。でも開発用途なら prefetch は十分に美味しそうなので有効にしそう。

僕は git gc を時々手で打っていたけど、今後は git maintenance run --task gc にしようという気持ちになりました。(いや gc する必要はなくて incremental-repack で十分そうなので引数なしで打つと思う)

というか auto で動くので普段は意識しないか。

全般に「ユーザー操作の邪魔をしない」ように設計されているのかなという感想でした。

なんで気になったの

git の release note を Slack に流していて、v2.52.rc0 のタグが付いたのを見たので。

v2.52.rc0 を打ったコミット を見て、git maintenancestrategy: geometric って何だろう?って疑問からドキュメントを見てみた。という経緯でした。

*1:porcelain については Git - Plumbing and Porcelain を参照