git-repo-doctor は何をしますか?
肥大化したGitリポジトリのための読み取り専用診断+安全クリーンアップアドバイザー。
このスキルを使用するタイミング
.gitディレクトリが数ギガバイトにまで肥大化している。objects/pack/tmp_pack_*やobjects/??/tmp_obj_*ファイルが蓄積している。git count-objects -vでgarbageの数が大きい、または数十万ものルースオブジェクトが表示される。gc.auto=0が設定されている、または gc / repack / fetch が繰り返し中断される。- エディタやコーディングエージェント(Codex、Claude Code、Cursor、IDEインデクサー)がリポジトリのスキャン中にクラッシュまたはOOMになる。
- ユーザーがリポジトリの安全な縮小、クリーニング、プルーニング、ガベージコレクション、またはディスク容量の回収について質問する。
実行方法
依存関係ゼロのPython 3スクリプトです。厳密に読み取り専用です。
# カレントディレクトリを含むリポジトリを診断する:
python3 scripts/git_repo_doctor.py
# 特定のgitディレクトリを指定する(リネーム・無効化されたものも含む):
python3 scripts/git_repo_doctor.py --git-dir /path/to/.git.disabled-xyz
# 機械可読な出力(エージェントとして動作する際にパースする):
python3 scripts/git_repo_doctor.py --json
# リモート到達可能性プローブをスキップする(オフラインまたはネットワークが遅い場合):
python3 scripts/git_repo_doctor.py --no-remote
返される内容
- サイズ内訳 - 明確なガベージ / ルースオブジェクト / パック / 到達可能履歴 / 到達不可能推定 / ディスク余裕。
- 健康上の問題 -
gc.auto=0、古いgc.log、$HOMEと等しいワークツリー、Syncthingが.gitを同期している、ルースオブジェクトの氾濫、残存テンポラリファイル。 - 推奨事項(以下のいずれか):
- PATH A (到達可能履歴が小さい): セーフティネットとしてバンドルを作成し、復元できることを確認してから、段階的かつ遅延削除を実行。
- PATH B (履歴が豊富): インプレースで
git maintenance+gc/repackを実行。ディスクが逼迫している場合は、最初にガベージを削除。 - filter-repo / BFG ヒント: 巨大なブロブが到達可能履歴に存在する場合。
- コピーしてすぐ使える、ロールバック対応のクリーンアップ計画(明示的なロールバックポイント付き)。スクリプトはコマンドを表示するのみで、一切実行しません。
エージェントによる出力の使用方法
- スクリプトを実行し、サイズ内訳、健康上の問題、推奨されるPATHをユーザーに要約して提示します。
- 表示された計画を提示しますが、その中のいかなるコマンドも自動実行してはいけません。クリーンアップは不可逆的であり、人間が破壊的な各ステップを確認する必要があります。
- 常に
$GITDIRの値を確認し、バンドルが作成・検証されていることを確認し、ユーザーが確信するまでバンドルを保持してください。
安全性に関する契約
このツールは決して gc、prune、repack、rm、reflog expire、またはその他の変更コマンドを実行しません。実行するのは読み取り専用のGitクエリとファイルシステム統計のみで、すべてタイムアウトで保護されています。破壊的なアクションはすべて、人間が確認して実行するために、印刷された計画の中にテキストとしてのみ存在します。
決定ロジック(概要)
| 条件 | 推奨事項 |
|---|---|
| 到達可能 < 1 GiB かつ 全体の10%未満 | PATH A: バンドル + 段階的削除 / 再構築 |
| 到達可能が大きく、空き容量が十分 | PATH B: git maintenance + gc/repack をインプレースで実行 |
| 到達可能が大きく、ディスクが逼迫 | 最初にガベージを削除し、その後 repack |
| パックされたオブジェクトが少ないがパックサイズが巨大 | 巨大ブロブヒント(git-sizer を実行、git-filter-repo を検討) |
完全なドキュメントとレポートの例については README.md を参照してください。