Git Maintenance:数千コミットのリポジトリを「爆速」にするメンテナンス術

Git tutorial - IT technology blog
Git tutorial - IT technology blog

30秒で自動メンテナンスを有効化する

git statusを打ってからコーヒーを淹れる時間ができるほど遅くなるまで、最適化を待つ必要はありません。数年前から続いているプロジェクトで、.gitディレクトリが数GBにまで膨れ上がっているなら、Gitに自動で整理させましょう。ルートディレクトリで以下のコマンドを1つ実行するだけです:

git maintenance start

このコマンドは非常に強力で、以下の処理を行います:

  • リポジトリをGitの「特別ケアリスト」に追加します。
  • crontab (macOS/Linux) または Task Scheduler (Windows) を自動的に設定し、バックグラウンドでクリーンアップタスクを実行します。

Gitが実際に「スケジュール予約」されたか確認したい場合は、以下のコマンドを実行してください:

git maintenance status

なぜ大規模プロジェクトでこのコマンドが必須なのか?

実際に私が参加したあるモノレポ(Monorepo)プロジェクトでは、.gitファイルが15GBまで肥大化していました。毎回 git fetch に3分近くかかり、非常にストレスフルでした。メンテナンスを有効にした後、この時間は約30秒にまで短縮されました。

通常、git gc (garbage collection) の仕組みは、不要なファイルが一定のしきい値を超えたときにのみ実行されます。困ったことに、それは大抵コードを急いでプッシュしようとしている瞬間に動き出し、ターミナルをフリーズさせます。git maintenance (Git 2.29以降で利用可能) は、重いタスクを細分化し、PCがアイドル状態の時に実行することで、この問題を根本的に解決します。

バックグラウンドで実行される「重要」なタスク

このモードを有効にすると、Gitは背後で以下の3つの重要な処理を静かに行います:

1. Prefetch(1時間ごとに実行)

コマンドを打つのを待つのではなく、Gitはサーバーから新しいオブジェクトをバッファ領域 (refs/prefetch/) に自動で事前ダウンロードします。実際に git fetch を実行するときには、データはすでにローカルにあるため、速度はほぼ瞬時になります。

2. Commit-graph(1時間ごとに実行)

これはGitがコミット履歴をより速く参照するための「地図」です。これがないと、GitKrakenのようなツールや git log --graph コマンドは、すべてのオブジェクトをスキャンする必要があり、CPUを大量に消費します。commit-graphがあれば、ブランチの表示が格段にスムーズになります。

3. Loose-objects(毎日実行)

バラバラになったファイルを圧縮されたパックファイル (packfiles) にまとめます。これにより、ディスク容量が解放されるだけでなく、ファイルの読み書き操作も明らかに速くなります。

# 速度を体感するために手動で実行してみる
git maintenance run --task=commit-graph

「ハードコア」なニーズに合わせたカスタマイズ

デフォルト設定で十分なことが多いですが、時には .config ファイルを通じてより深く介入したい場合もあります。

自動フェッチ機能をオフにする

Gitが勝手にサーバーに接続することによる帯域幅やセキュリティが心配な場合は、prefetchタスクだけを個別にオフにできます:

git config maintenance.prefetch.enabled false
git config maintenance.commit-graph.enabled true

Incremental Repackで徹底的に整理する

画像や動画などのバイナリファイルを多く含むリポジトリでは、incremental-repack タスクが小さなデータパックを大きなパックにまとめ、インデックスを最適化します。以下のコマンドで強制的に実行できます:

git maintenance run --task=incremental-repack

6ヶ月運用して得た「実戦的」な注意点

チーム全体に導入するのは難しくありませんが、いくつか覚えておくべき点があります:

  • PCの重さを心配する必要なし: これらのタスクは最低優先度 (low priority) で実行されます。動画のレンダリングやゲームをしている最中であれば、OSが自動的にGitを待機状態にします。
  • Windowsでのエラー: 一部の社内PCでは、Task Scheduler の権限が制限されている場合があります。start コマンドでエラーが出る場合は、IT部門に権限を依頼するか、手動でタスクを追加する必要があります。
  • CI/CDの救世主: JenkinsやGitLab Runnerを実行しているサーバーでメンテナンスを有効にすると、長期間のゴミデータの蓄積による「ディスクフル」エラーを回避できます。

結論として、Gitの動作が重くなってきたと感じたら、すぐにリポジトリを削除してクローンし直すのではなく、まず git maintenance を試してみてください。プロジェクトが終了して設定を解除したい場合は、以下を打つだけです:

git maintenance stop

このコマンドは設定されたスケジュールをすべて削除し、システムを元の状態に戻します。

Share: