セットアップと設定
プロジェクトの取得と作成
基本的なスナップショット
ブランチとマージ
プロジェクトの共有と更新
検査と比較
パッチ適用
デバッグ
メール
外部システム
サーバー管理
- 2.49.1 → 2.50.1 変更なし
-
2.49.0
2025-03-14
- 2.47.1 → 2.48.2 変更なし
-
2.47.0
2024-10-06
- 2.43.1 → 2.46.4 変更なし
-
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 の呼び出しから作成された可能性のある到達不能なオブジェクトの削除、参照のパッキング、reflog、rerere メタデータ、または古い作業ツリーのプルーニングなど、さまざまなハウスキーピングタスクを実行します。コミットグラフなどの補助的なインデックスを更新することもできます。
オブジェクトを作成する一般的なポーセリン操作が実行されると、最後にメンテナンスされてからリポジトリが大幅に増加したかどうかを確認し、増加していれば git
gc
を自動的に実行します。この動作を無効にする方法については、以下の gc.auto
を参照してください。
git
gc
を手動で実行する必要があるのは、定期的にそのようなポーセリンコマンドを実行せずにリポジトリにオブジェクトを追加する場合、一回限りのリポジトリ最適化を行う場合、または例えば最適な状態ではない大量インポートをクリーンアップする場合などです。インポートのケースの詳細については、git-fast-import[1] の「PACKFILE OPTIMIZATION」セクションを参照してください。
オプション
- --aggressive
-
通常、git gc は非常に高速に実行され、良好なディスク容量利用率とパフォーマンスを提供します。このオプションを使用すると、git gc ははるかに多くの時間を要する代わりに、リポジトリをより積極的に最適化します。この最適化の効果はほとんど永続的です。詳細については、以下の「AGGRESSIVE」セクションを参照してください。
- --auto
-
このオプションを使用すると、git gc はハウスキーピングが必要かどうかをチェックします。不要であれば、何も実行せずに終了します。
このヒューリスティックがどのように機能するかについては、以下の「CONFIGURATION」セクションの
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 はルーズオブジェクトの古さに関係なくプルーニングし、別のプロセスがリポジトリに同時に書き込んでいる場合、破損のリスクが増加します。以下の「NOTES」を参照してください。--prune はデフォルトでオンです。 - --no-prune
-
ルーズオブジェクトをプルーニングしません。
- --quiet
-
すべての進捗レポートを抑制します。
- --force
-
このリポジトリで別の
git
gc
インスタンスが実行されている可能性がある場合でも、git
gc
の実行を強制します。 - --keep-largest-pack
-
最大の非クラフトパック、
.keep
ファイルでマークされたパック、およびクラフトパック以外のすべてのパックが1つのパックに統合されます。このオプションを使用する場合、gc.bigPackThreshold
は無視されます。
AGGRESSIVE
--aggressive
オプションが指定された場合、git-repack[1] は -f
フラグで呼び出され、これは次に --no-reuse-delta
を git-pack-objects[1] に渡します。これにより、既存のデルタはすべて破棄され、再計算されますが、再パッキングに多くの時間がかかります。
この効果はほとんど永続的です。例えば、パックとルーズオブジェクトが互いに結合されて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
が設定されていない場合、最大のパックも除外されます(これはgit
gc
を--keep-largest-pack
と共に実行するのと同じです)。 - 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] の「NOTES」セクションを参照してください。 - gc.worktreePruneExpire
-
git gc が実行されると、git worktree prune --expire 3.months.ago を呼び出します。この設定変数を使用して、異なる猶予期間を設定できます。「now」という値を使用すると、猶予期間を無効にして
$GIT_DIR/worktrees
をすぐにプルーニングできます。「never」という値を使用すると、プルーニングを抑制できます。 - gc.reflogExpire
- gc.<pattern>.reflogExpire
-
git reflog expire はこの時刻より古いリフログエントリを削除します。デフォルトは90日です。「now」という値はすべてのエントリを直ちに期限切れにし、「never」という値は期限切れを完全に抑制します。中央に「<pattern>」(例: 「refs/stash」)を使用すると、設定は<pattern>に一致するリファレンスにのみ適用されます。
- gc.reflogExpireUnreachable
- gc.<pattern>.reflogExpireUnreachable
-
git reflog expire は、この時刻より古く、かつ現在の先端から到達できないリフログエントリを削除します。デフォルトは30日です。「now」という値はすべてのエントリを直ちに期限切れにし、「never」という値は期限切れを完全に抑制します。中央に「<pattern>」(例: 「refs/stash」)を使用すると、設定は<pattern>に一致するリファレンスにのみ適用されます。
これらのタイプのエントリは、通常
git
commit
--amend
またはgit
rebase
を使用した結果として作成され、修正またはリベースが発生する前のコミットです。これらの変更は現在のプロジェクトの一部ではないため、ほとんどのユーザーはそれらをより早く期限切れにしたいと考えるでしょう。そのため、デフォルトはgc.reflogExpire
よりもアグレッシブです。 - gc.recentObjectsHook
-
オブジェクトを削除するかどうかを検討する際(クラフトパックを生成する場合または到達不能なオブジェクトをルーズとして保存する場合のいずれか)、シェルを使用して指定されたコマンドを実行します。その出力を、Gitが古さに関係なく「最近の」と見なすオブジェクトIDとして解釈します。それらのmtimeを「now」として扱うことで、出力に記載されたすべてのオブジェクト(およびその子孫)は、実際の古さに関係なく保持されます。
出力には、1行に正確に1つの16進オブジェクトIDが含まれ、それ以外は何も含まれてはなりません。リポジトリで見つからないオブジェクトは無視されます。複数のフックがサポートされていますが、すべてが正常に終了する必要があります。そうでない場合、操作(クラフトパックの生成または到達不能なオブジェクトのアンパックのいずれか)は停止されます。
- gc.repackFilter
-
再パック時、指定されたフィルターを使用して特定のオブジェクトを別のパックファイルに移動します。git-repack[1] の
--filter=
<filter-spec> オプションを参照してください。 - gc.repackFilterTo
-
再パック時、およびフィルターを使用している場合(
gc.repackFilter
を参照)、指定された場所はフィルター処理されたオブジェクトを含むパックファイルを作成するために使用されます。警告:指定された場所はアクセス可能である必要があります。例えばGitの代替メカニズムを使用するなどしてください。そうでない場合、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]スイートの一部