日本語 ▾ トピック ▾ 最新バージョン ▾ git-gc は2.49.0で最終更新

名前

git-gc - 不要なファイルをクリーンアップし、ローカルリポジトリを最適化する

概要

git gc [--aggressive] [--auto] [--[no-]detach] [--quiet] [--prune=<date> | --no-prune] [--force] [--keep-largest-pack]

説明

現在のリポジトリ内で、ファイルリビジョンの圧縮(ディスク容量の削減とパフォーマンスの向上)、以前の git add の呼び出しから作成された到達不能なオブジェクトの削除、参照のパック、参照ログの剪定、rerereメタデータまたは古い作業ツリーの剪定など、様々なハウスキーピングタスクを実行します。コミットグラフなどの補助的なインデックスも更新することがあります。

オブジェクトを作成する一般的なポーセリン操作が実行されると、前回のメンテナンス以降にリポジトリが大幅に増大したかどうかを確認し、増大していれば自動的に git gc を実行します。この動作を無効にする方法については、以下の gc.auto を参照してください。

git gc を手動で実行する必要があるのは、そのようなポーセリンコマンドを定期的に実行せずにオブジェクトをリポジトリに追加する場合、一度限りのリポジトリ最適化を行う場合、または例えば最適ではない大量インポートをクリーンアップする場合のみです。インポートケースの詳細については、git-fast-import[1] の「PACKFILE OPTIMIZATION」セクションを参照してください。

オプション

--aggressive

通常、git gc は良好なディスクスペース利用率とパフォーマンスを提供しながら非常に高速に実行されます。このオプションは、git gc がリポジトリをより積極的に最適化する原因となりますが、その分はるかに多くの時間がかかります。この最適化の効果はほとんど永続的です。詳細については、以下の「アグレッシブな最適化」セクションを参照してください。

--auto

このオプションを使用すると、git gc はハウスキーピングが必要かどうかを確認します。必要なければ、何も実行せずに終了します。

このヒューリスティックの動作方法については、以下の「設定」セクションの gc.auto オプションを参照してください。

gc.autogc.autoPackLimit などの設定オプションの制限を超えてハウスキーピングがトリガーされると、他のすべてのハウスキーピングタスク(例: rerere、作業ツリー、reflog…​)も実行されます。

--[no-]detach

システムがサポートしていればバックグラウンドで実行します。このオプションは gc.autoDetach 設定を上書きします。

--[no-]cruft

到達不能なオブジェクトを期限切れにする際、それらをルーズオブジェクトとして保存する代わりに、個別にクラフトパックにパックします。--cruft はデフォルトでオンです。

--max-cruft-size=<n>

到達不能なオブジェクトをクラフトパックにパックする際、新しいクラフトパックのサイズを最大 <n> バイトに制限します。gc.maxCruftSize 設定で指定された値を上書きします。詳細については、git-repack[1]--max-cruft-size オプションを参照してください。

--expire-to=<dir>

到達不能なオブジェクトをクラフトパックにパックする際、剪定されたオブジェクト(もしあれば)を含むクラフトパックをディレクトリ <dir> に書き込みます。このオプションは、--cruft と一緒に使用した場合にのみ効果があります。詳細については、git-repack[1]--expire-to オプションを参照してください。

--prune=<date>

指定した日付よりも古いルーズオブジェクトを剪定します(デフォルトは2週間前で、設定変数 gc.pruneExpire で上書きできます)。--prune=now はルーズオブジェクトの経過期間に関係なく剪定し、別のプロセスが同時にリポジトリに書き込みを行っている場合、破損のリスクを高めます。以下の「注記」を参照してください。--prune はデフォルトでオンです。

--no-prune

ルーズオブジェクトを剪定しません。

--quiet

すべての進捗レポートを抑制します。

--force

このリポジトリで別の git gc インスタンスが実行されている可能性があっても、git gc を強制的に実行します。

--keep-largest-pack

最大の非クラフトパック、.keep ファイルでマークされたパック、およびすべてのクラフトパックを除くすべてのパックが1つのパックに統合されます。このオプションが使用される場合、gc.bigPackThreshold は無視されます。

アグレッシブな最適化

--aggressive オプションが指定されると、git-repack[1]-f フラグ付きで呼び出され、それはさらに --no-reuse-deltagit-pack-objects[1] に渡します。これにより、既存のデルタはすべて破棄され、再計算されますが、リパックにはるかに多くの時間がかかります。

この効果はほとんど永続的で、例えばパックとルーズオブジェクトが別のパックに統合されると、そのパック内の既存のデルタが再利用される可能性がありますが、新しいパックから最適ではないデルタを選択する様々なケースもあります。

さらに、--aggressive を指定すると、git-repack[1] に渡される --depth および --window オプションが調整されます。以下の gc.aggressiveDepth および gc.aggressiveWindow 設定を参照してください。より大きなウィンドウサイズを使用することで、より最適なデルタを見つけやすくなります。

特定のリポジトリでパフォーマンスベンチマークを実行せずにこのオプションを使用することは、おそらく価値がありません。はるかに多くの時間がかかり、結果として得られるスペース/デルタ最適化が価値があるかどうかは不明です。このオプションをまったく使用しないことが、ほとんどのユーザーとそのリポジトリにとって適切なトレードオフです。

設定

このセクションのこの行より下の内容は、git-config[1] ドキュメントから選択的に含まれています。内容はそちらで見つかるものと同じです。

gc.aggressiveDepth

git gc --aggressive で使用されるデルタ圧縮アルゴリズムで使用される深さパラメータです。デフォルトは50で、これは--aggressive が使用されていない場合の --depth オプションのデフォルト値です。

詳細については、git-repack[1]--depth オプションのドキュメントを参照してください。

gc.aggressiveWindow

git gc --aggressive で使用されるデルタ圧縮アルゴリズムで使用されるウィンドウサイズパラメータです。デフォルトは250で、これはデフォルトの --window の10よりもはるかにアグレッシブなウィンドウサイズです。

詳細については、git-repack[1]--window オプションのドキュメントを参照してください。

gc.auto

リポジトリ内にこの数以上のルーズオブジェクトが約存在する場合、git gc --auto はそれらをパックします。いくつかのポーセリンコマンドは、時折軽量なガベージコレクションを実行するためにこのコマンドを使用します。デフォルト値は6700です。

これを0に設定すると、ルーズオブジェクトの数に基づく自動パックだけでなく、gc.autoPackLimit のように git gc --auto が作業があるかどうかを判断するために使用する他のヒューリスティックもすべて無効になります。

gc.autoPackLimit

リポジトリ内に *.keep ファイルでマークされていないパックがこの数より多く存在する場合、git gc --auto はそれらを1つの大きなパックに統合します。デフォルト値は50です。これを0に設定すると無効になります。gc.auto を0に設定しても無効になります。

以下の gc.bigPackThreshold 設定変数を参照してください。使用されている場合、これは自動パック制限の動作に影響します。

gc.autoDetach

システムがサポートしていれば、git gc --auto がすぐに戻り、バックグラウンドで実行されるようにします。デフォルトはtrueです。この設定変数は、maintenance.autoDetach が設定されていない場合のフォールバックとして機能します。

gc.bigPackThreshold

ゼロ以外の場合、git gc が実行されるときに、この制限よりも大きいすべての非クラフトパックが保持されます。これは --keep-largest-pack と非常に似ていますが、最大のパックだけでなく、しきい値を満たすすべての非クラフトパックが保持される点が異なります。デフォルトはゼロです。kmg などの一般的な単位接尾辞がサポートされています。

保持されるパックの数が gc.autoPackLimit を超える場合、この設定変数は無視され、ベースパックを除くすべてのパックがリパックされます。これによりパックの数が gc.autoPackLimit を下回り、gc.bigPackThreshold が再び尊重されるはずです。

git repack がスムーズに実行されるために推定されるメモリ量が利用できず、gc.bigPackThreshold が設定されていない場合、最大のパックも除外されます(これは --keep-largest-pack を使用して git gc を実行するのと同等です)。

gc.writeCommitGraph

trueの場合、git-gc[1] が実行されると、gcはコミットグラフファイルを書き換えます。git gc --auto を使用する場合、ハウスキーピングが必要であればコミットグラフが更新されます。デフォルトはtrueです。詳細については、git-commit-graph[1] を参照してください。

gc.logExpiry

ファイル gc.log が存在する場合、git gc --auto はその内容を出力し、そのファイルが gc.logExpiry より古くない限り、実行せずにステータスゼロで終了します。デフォルトは「1.day」です。値の指定方法については gc.pruneExpire を参照してください。

gc.packRefs

リポジトリで git pack-refs を実行すると、HTTPなどのダムトランスポート経由でGitバージョン1.5.1.2以前のバージョンでクローンできなくなります。この変数は、git gcgit pack-refs を実行するかどうかを決定します。これはすべてのノンベアリポジトリ内で有効にするために notbare に設定することも、ブール値に設定することもできます。デフォルトは true です。

gc.cruftPacks

到達不能なオブジェクトをルーズオブジェクトとしてではなく、クラフトパックに保存します(git-repack[1] を参照)。デフォルトは true です。

gc.maxCruftSize

リパック時に新しいクラフトパックのサイズを制限します。--max-cruft-size に加えて指定された場合、コマンドラインオプションが優先されます。詳細については、git-repack[1]--max-cruft-size オプションを参照してください。

gc.pruneExpire

git gc が実行されると、*prune --expire 2.weeks.ago*(および gc.cruftPacks または --cruft を介してクラフトパックを使用している場合は *repack --cruft --cruft-expiration 2.weeks.ago*)が呼び出されます。この設定変数で猶予期間を上書きします。「now」の値を使用すると、この猶予期間を無効にして、常に到達不能なオブジェクトを即座に剪定できます。「never」を使用すると、剪定を抑制できます。この機能は、git gc が別のプロセスと同時にリポジトリに書き込みを行う場合に、破損を防ぐのに役立ちます。git-gc[1] の「注記」セクションを参照してください。

gc.worktreePruneExpire

git gc が実行されると、*git worktree prune --expire 3.months.ago* を呼び出します。この設定変数を使用して、異なる猶予期間を設定できます。「now」の値を使用すると、猶予期間を無効にして $GIT_DIR/worktrees を即座に剪定できます。「never」を使用すると、剪定を抑制できます。

gc.reflogExpire
gc.<pattern>.reflogExpire

git reflog expire は、この時間より古いreflogエントリを削除します。デフォルトは90日です。「now」の値はすべてのエントリを即座に期限切れにし、「never」は期限切れを完全に抑制します。中央に「<pattern>」(例:「refs/stash」)がある場合、設定は <pattern> に一致する参照にのみ適用されます。

gc.reflogExpireUnreachable
gc.<pattern>.reflogExpireUnreachable

git reflog expire は、この時間より古く、現在のtipから到達不能なreflogエントリを削除します。デフォルトは30日です。「now」の値はすべてのエントリを即座に期限切れにし、「never」は期限切れを完全に抑制します。中央に「<pattern>」(例:「refs/stash」)がある場合、設定は <pattern> に一致する参照にのみ適用されます。

これらの種類のエントリは、一般的に git commit --amend または git rebase を使用した結果として作成され、修正またはリベースが行われる前のコミットです。これらの変更は現在のプロジェクトの一部ではないため、ほとんどのユーザーはそれらをより早く期限切れにしたいと考えるでしょう。これが、デフォルトが gc.reflogExpire よりも積極的である理由です。

gc.recentObjectsHook

オブジェクトを削除するかどうかを検討する際(クラフトパックを生成する場合、または到達不能なオブジェクトをルーズとして保存する場合)、シェルを使用して指定されたコマンドを実行します。その出力を、Gitが経過期間に関わらず「最近の」オブジェクトと見なすオブジェクトIDとして解釈します。それらのmtimeを「現在」として扱うことで、出力で言及されたオブジェクト(およびその子孫)は、その実際の経過期間に関わらず保持されます。

出力は1行につき正確に1つの16進オブジェクトIDを含み、他は含んでいません。リポジトリに見つからないオブジェクトは無視されます。複数のフックがサポートされていますが、すべてが正常に終了する必要があります。そうでない場合、操作(クラフトパックの生成または到達不能なオブジェクトのアンパック)は停止します。

gc.repackFilter

リパック時に、指定されたフィルターを使用して特定のオブジェクトを別のパックファイルに移動します。詳細については、git-repack[1]--filter=<filter-spec> オプションを参照してください。

gc.repackFilterTo

リパック時にフィルターを使用する場合、gc.repackFilter を参照し、指定された場所はフィルターで除外されたオブジェクトを含むパックファイルを作成するために使用されます。警告: 指定された場所は、例えばGitのalternatesメカニズムを使用してアクセス可能である必要があります。そうでない場合、Gitはそのパックファイル内のオブジェクトにアクセスできない可能性があるため、リポジトリが破損していると見なされる可能性があります。詳細については、git-repack[1]--filter-to=<dir> オプションと gitrepository-layout[5]objects/info/alternates セクションを参照してください。

gc.rerereResolved

git rerere gc が実行されるとき、以前に解決した競合マージの記録は、この日数だけ保持されます。より人間が読みやすい「1.month.ago」なども使用できます。デフォルトは60日です。git-rerere[1] を参照してください。

gc.rerereUnresolved

git rerere gc が実行されるとき、まだ解決されていない競合マージの記録は、この日数だけ保持されます。より人間が読みやすい「1.month.ago」なども使用できます。デフォルトは15日です。git-rerere[1] を参照してください。

注記

git gc は、リポジトリのどこかで参照されているオブジェクトを削除しないように非常に注意します。特に、現在のブランチとタグのセットで参照されているオブジェクトだけでなく、インデックス、リモート追跡ブランチ、参照ログ(後で修正または巻き戻されたブランチのコミットを参照する可能性があります)、および refs/* 名前空間内の他のすべてで参照されているオブジェクトも保持します。オブジェクトに添付されたノート(git notes で作成された種類)は、オブジェクトを保持することには寄与しないことに注意してください。いくつかのオブジェクトが削除されることを期待していて、それが削除されない場合は、それらすべての場所を確認し、あなたのケースでそれらの参照を削除することが理にかなっているかどうかを判断してください。

一方で、git gc が別のプロセスと同時に実行される場合、別のプロセスが使用しているが参照を作成していないオブジェクトを削除してしまうリスクがあります。これは、別のプロセスが失敗する原因となるか、後で別のプロセスが削除されたオブジェクトへの参照を追加した場合にリポジトリが破損する可能性があります。Gitには、この問題を大幅に軽減する2つの機能があります。

  1. 指定された --prune 日付より新しい変更時刻を持つオブジェクトは、そこから到達可能なものすべてと共に保持されます。

  2. データベースにオブジェクトを追加するほとんどの操作は、オブジェクトがすでに存在する場合、その変更時刻を更新するため、#1が適用されます。

しかし、これらの機能は完全な解決策には及ばないため、コマンドを同時に実行するユーザーは、ある程度の破損のリスクを受け入れる必要があります(実際には低いようです)。

フック

git gc --auto コマンドは pre-auto-gc フックを実行します。詳細については、githooks[5] を参照してください。

GIT

git[1] スイートの一部

scroll-to-top