Git LFSとは

git gc

git gc コマンドはリポジトリのメンテナンス コマンドです。"gc" はガベージ コレクションの略です。git gc を実行することは、文字どおり、現在のリポジトリ内で起きた混乱をクリーン アップするよう Git に指示することです。ガベージ コレクションは、動的なメモリ割り当てを行うインタプリタ型プログラミング言語に由来する概念です。インタプリタ言語でのガベージ コレクションは、実行中のプログラムがアクセスできなくなったメモリを回復するために使用されます。

Git リポジトリには、さまざまなタイプのガベージが蓄積されます。Git ガベージの 1 つのタイプは、孤立した、またはアクセスできないコミットです。git resetsgit 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

オプションの変数で、既定値は 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 prunegit repackgit packgit rerere のような他の内部サブコマンドのバンドルを実行します。これらのコマンドの大まかな役割は、git gc の構成で設定されたしきい値レベル外にある Git オブジェクトを特定することです。特定されると、これらのオブジェクトはそれに応じて圧縮または prune されます。

git gc のベスト プラクティスとよくある質問

ガベージ コレクションは、頻繁に使用されるいくつかのコマンドで自動的に実行されます。

git gc を手動で実行する必要がある頻度は、リポジトリのアクティビティ レベルに対応しています。貢献している開発者が 1 人であるリポジトリでは、頻繁に更新されるマルチユーザー リポジトリよりも git gc の実行頻度がはるかに少なくて済みます。

git gc と git prune

git gc は親コマンドで、git prune は子コマンドです。git gcgit 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 --autogit の構成をチェックして、緩いオブジェクトのしきい値とパッキングの圧縮サイズを確認します。これらの値は git config で設定できます。リポジトリがハウスキーピングしきい値のいずれかを超えた場合、git gc --auto が実行されます。

git gc を開始する

みなさんはおそらく、気付かずに既に git gc を使用しているでしょう。ベスト プラクティスのセクションで説明したように、これは、頻繁に使用するコマンドによって自動的に呼び出されます。手動で呼び出したい場合は単に git gc を実行するだけで、実行された作業内容を示す出力が表示されます。