セットアップと設定
プロジェクトの取得と作成
基本的なスナップショット
ブランチとマージ
プロジェクトの共有と更新
検査と比較
パッチ適用
デバッグ
Eメール
外部システム
サーバー管理
ガイド
- gitattributes
- コマンドラインインターフェースの慣例
- 日常的なGit
- よくある質問 (FAQ)
- 用語集
- フック
- gitignore
- gitmodules
- リビジョン
- サブモジュール
- チュートリアル
- ワークフロー
- すべてのガイド...
管理
プラミングコマンド
-
2.49.0
2025-03-14
- 2.47.1 → 2.48.1 変更なし
-
2.47.0
2024-10-06
- 2.43.1 → 2.46.3 変更なし
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 変更なし
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 変更なし
-
2.41.0
2023-06-01
- 2.38.1 → 2.40.4 変更なし
-
2.38.0
2022-10-02
- 2.37.1 → 2.37.7 変更なし
-
2.37.0
2022-06-27
- 2.31.1 → 2.36.6 変更なし
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 変更なし
-
2.30.0
2020-12-27
- 2.24.1 → 2.29.3 変更なし
-
2.24.0
2019-11-04
- 2.22.1 → 2.23.4 変更なし
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 変更なし
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 変更なし
-
2.20.0
2018-12-09
- 2.19.1 → 2.19.6 変更なし
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 変更なし
-
2.18.0
2018-06-21
- 2.13.7 → 2.17.6 変更なし
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
- 2.10.5 変更なし
-
2.9.5
2017-07-30
- 2.7.6 → 2.8.6 変更なし
-
2.6.7
2017-05-05
- 2.5.6 変更なし
-
2.4.12
2017-05-05
- 2.1.4 → 2.3.10 変更なし
-
2.0.5
2014-12-17
概要
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.auto
やgc.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-delta
を git-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
と非常に似ていますが、最大のパックだけでなく、しきい値を満たすすべての非クラフトパックが保持される点が異なります。デフォルトはゼロです。k、m、g などの一般的な単位接尾辞がサポートされています。保持されるパックの数が 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 gc がgit 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つの機能があります。
-
指定された
--prune
日付より新しい変更時刻を持つオブジェクトは、そこから到達可能なものすべてと共に保持されます。 -
データベースにオブジェクトを追加するほとんどの操作は、オブジェクトがすでに存在する場合、その変更時刻を更新するため、#1が適用されます。
しかし、これらの機能は完全な解決策には及ばないため、コマンドを同時に実行するユーザーは、ある程度の破損のリスクを受け入れる必要があります(実際には低いようです)。
フック
git gc --auto コマンドは pre-auto-gc フックを実行します。詳細については、githooks[5] を参照してください。
GIT
git[1] スイートの一部