git-maintenance とは
git maintenance は、Git 2.29 で導入されたリポジトリのメンテナンス機構です。
porcelain command (高レベル API) *1 ですね。
従来の git gc と似ていますが、ユーザー入力をブロックしないし、適切にロック処理も行っているので、より安全で継続的な運用を意識した設計になっています。
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によって動作が変わる- strategy:
incrementalの場合は以下 gc: disabled.
commit-graph: hourly.
prefetch: hourly.
loose-objects: daily.
incremental-repack: daily.
- strategy:
hourly で prefetch するの面白い。変化が大きい && 自分がよく見るリポジトリだと待ち時間が減って便利かも。
strategy は v2.52 から geometric が増えるっぽいです。これは incremental-repack じゃなく git repack --geometric する戦略。Scaling monorepo maintenance - The GitHub Blog にあるように、大きな monorepo だと geometric の方が効果があるのかもしれない
git maintenance は普段から動いている
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 maintenance の strategy: geometric って何だろう?って疑問からドキュメントを見てみた。という経緯でした。
*1:porcelain については Git - Plumbing and Porcelain を参照