git gc
git gc
コマンドはリポジトリのメンテナンス コマンドです。"gc" はガベージ コレクションの略です。git gc
を実行することは、文字どおり、現在のリポジトリ内で起きた混乱をクリーン アップするよう Git に指示することです。ガベージ コレクションは、動的なメモリ割り当てを行うインタプリタ型プログラミング言語に由来する概念です。インタプリタ言語でのガベージ コレクションは、実行中のプログラムがアクセスできなくなったメモリを回復するために使用されます。
Git リポジトリには、さまざまなタイプのガベージが蓄積されます。Git ガベージの 1 つのタイプは、孤立した、またはアクセスできないコミットです。git resets や git rebase などの履歴変更コマンドを実行すると、Git コミットにアクセスできなくなる可能性があります。履歴を保存し、データの損失を避けるために、Git は切り離されたコミットを削除しません。切り離されたコミットは引き続き、git log
を介してチェックアウト、チェリーピック、調査ができます。
切り離されたコミットのクリーン アップに加えて、git gc
は、保存された Git オブジェクトの圧縮も実行し、貴重なディスク容量を解放します。Git が類似のオブジェクトのグループを識別すると、それらを「パック」に圧縮します。パックは Git オブジェクトの zip ファイルのようなもので、リポジトリ内の ./git/objects/pack
ディレクトリに存在します。
git gc が実際に行っている処理内容
実行前に、git gc
は最初に、いくつかの git config 値をチェックします。これらの値は、git gc
の残りの責任を明確にするのに役立ちます。
git gc の構成
gc.reflogExpire
オプションの変数で、既定値は 90 日です。これは、ブランチの reflog 内のレコードを保存する必要がある期間を設定するために使用されます。
gc.reflogExpireUnreachable
オプションの変数で、既定値は 30 日です。アクセスできない reflog レコードを保存する期間を設定するために使用されます。
gc.aggressiveWindow
関連資料
Git リポジトリ全体を移動する方法
ソリューションを見る
Bitbucket Cloud での Git の使用方法についてのチュートリアルです。
オプションの変数で、既定値は 250 です。git gc
が --aggressive
オプションを指定して実行されたときに、オブジェクト パッキングのデルタ圧縮フェーズに費やす時間を制御します。
gc.aggressiveDepth
オプションの変数で、既定値は 50 です。git gc --aggresive
の実行中に git-repack
が使用する圧縮の深さを制御します。
gc.pruneExpire
オプションの変数で、既定値は "2 weeks ago" です。アクセスできないオブジェクトが prune されるまでの保存期間を設定します。
gc.worktreePruneExpire
オプションの変数で、既定値は "3 months ago" です。古い作業ツリーが削除されるまでに保持される期間を設定します。
git gc の実行
舞台裏で git gc
は実際には git prune、git repack
、git pack
、git rerere
のような他の内部サブコマンドのバンドルを実行します。これらのコマンドの大まかな役割は、git gc
の構成で設定されたしきい値レベル外にある Git オブジェクトを特定することです。特定されると、これらのオブジェクトはそれに応じて圧縮または prune されます。
git gc のベスト プラクティスとよくある質問
ガベージ コレクションは、頻繁に使用されるいくつかのコマンドで自動的に実行されます。
git gc
を手動で実行する必要がある頻度は、リポジトリのアクティビティ レベルに対応しています。貢献している開発者が 1 人であるリポジトリでは、頻繁に更新されるマルチユーザー リポジトリよりも git gc
の実行頻度がはるかに少なくて済みます。
git gc と git prune
git gc
は親コマンドで、git prune
は子コマンドです。git gc
は git prune
を内部的にトリガーします。git prune
は、git gc
の構成によってはアクセスできないと見なされた Git オブジェクトを削除するために使用されます。git prune について詳細をご覧ください。
git gc aggressive とは
git gc
は --aggressive
コマンドライン オプションを指定して呼び出すことができます。--aggressive
オプションを指定すると、git gc
は最適化作業により多くの時間を費やすようになります。これにより git gc
の実行速度は遅くなりますが、完了後はより多くのディスク容量を節約できます。--aggressive
の効果は永続的であり、リポジトリに大量の変更を加えた後にのみ実行する必要があります。
git gc auto とは
git gc --auto
コマンド バリアントは、実行前にまずリポジトリでハウスキーピングが必要かどうかをチェックします。ハウスキーピングが必要ないことが分かったら、何もせずに終了します。一部の Git コマンドは、実行後に git gc --auto
を暗黙的に実行して、作成した緩いオブジェクトをクリーン アップします。
実行前に git gc --auto
は git
の構成をチェックして、緩いオブジェクトのしきい値とパッキングの圧縮サイズを確認します。これらの値は git config で設定できます。リポジトリがハウスキーピングしきい値のいずれかを超えた場合、git gc --auto
が実行されます。
git gc を開始する
みなさんはおそらく、気付かずに既に git gc
を使用しているでしょう。ベスト プラクティスのセクションで説明したように、これは、頻繁に使用するコマンドによって自動的に呼び出されます。手動で呼び出したい場合は単に git gc
を実行するだけで、実行された作業内容を示す出力が表示されます。
この記事を共有する
次のトピック
おすすめコンテンツ
次のリソースをブックマークして、DevOps チームのタイプに関する詳細や、アトラシアンの DevOps についての継続的な更新をご覧ください。