web-dev-qa-db-ja.com

Gitリモートリポジトリでガベージコレクションをトリガーするにはどうすればよいですか?

知っているように、定期的にgit gcを実行して、.git/objectsの下にオブジェクトをパックできます。

ただし、リモートの中央Gitリポジトリの場合(裸かどうか)、多くのプッシュの後、myproj.git/objectsの下に多くのファイルがあります。各コミットはそこに新しいファイルを作成するようです。

そのように多くのファイルをパックするにはどうすればよいですか? (ローカルクローンリポジトリではなく、リモートの中央ベアリポジトリにあるものを意味します。)

50
peterwang

コミットが行われた後、必要に応じてgcを実行するようにリモートリポジトリを設定する必要があります。 git-gcおよびgit-configのマニュアルページのgc.autoのドキュメントを参照してください。

ただし、リモートレポジトリはガベージコレクションをそれほど必要としません。これは、ダングリング(到達不能)コミットがほとんどないためです。これらは通常、ブランチの削除やリベースなど、通常はローカルリポジトリでのみ発生します。

したがって、gcは、実際のガベージを削除するのではなく、ストレージスペースを節約するための再梱包にさらに必要です。これを処理するには、gc.auto変数で十分です。

49
Neil Mayhew

定期的かつ自動的にこれを処理するプロセスが必要ですが、実行しても問題ありません

git gc

裸のリポジトリ上

git@domU:/pix/git/repositories/abd.git$ ls -l

total 28
drwxrwxr-x   2 git git    6 2010-06-06 02:44 branches
-rw-rw-r--   1 git git   66 2010-06-06 02:44 config
-rw-r--r--   1 git git   23 2011-03-15 18:19 description
-rw-rw-r--   1 git git   23 2010-06-06 02:44 HEAD
drwxrwxr-x   2 git git 4096 2010-06-06 02:44 hooks
drwxrwxr-x   2 git git   20 2010-06-06 02:44 info
drwxrwxr-x 260 git git 8192 2010-09-01 00:26 objects
drwxrwxr-x   4 git git   29 2010-06-06 02:44 refs

$ git gc
Counting objects: 3833, done.
Compressing objects:  31% (1085/3500)...
13
user122299

この質問 ガベージコレクションを実行する頻度を明らかにする必要があります。

最も簡単なオプションは、git gcを定期的に実行するために、WindowsのスケジュールされたタスクまたはUnixのcronジョブを使用することです。このように、あなたはそれについて考える必要さえありません。

4
Igor Zevaka

多くのプッシュの後、myproj.git/objectsの下に多くのファイルがあります

Git 2.11+(2016年第4四半期)とpre-receiveフックはそれほど多くありません。
そのシナリオでは、git gcをトリガーする必要はまったくありません

commit 62fe0ebcommit e34c2ecommit 722ff7fcommit 2564d99commit 526f108 を参照してください(2016年10月3日)by ジェフ・キング(peff .
浜野潤夫-gitster- in コミット25ab004 、2016年10月17日)

receive-pack:pre-receiveが受け入れるまでオブジェクトを隔離します

「git Push」の受信側が受信した履歴を検査し、プッシュを拒否することを決定するには、送信側から送信されたオブジェクトをフックと接続性チェックのメカニズムで利用できるようにする必要があります。従来は、受信リポジトリにオブジェクトを保存し、「git gc」に期限切れを許可していました。

代わりに、新しく受け取ったオブジェクトを一時領域に保存し、チェックを受け入れるかどうかを決定し、決定したらリポジトリに移行するか、すぐにパージする間のみ、代替オブジェクトストアメカニズムを再利用して、それらを使用可能にします。

その一時領域は、新しい環境変数GIT_QUARANTINE_ENVIRONMENTによって設定されます。

そうすれば、(大きな)プッシュがpre-receiveフックによって拒否された場合、それらの大きなオブジェクトはgit gcがクリーンアップするのを待って90日間待機しません。

3
VonC