「最適なパフォーマンスを得るためのリポジトリの自動パッキング」とはどういう意味ですか?


225

gitリポジトリに問題があります。この2日間、サーバーにプッシュするたびに、「最適なパフォーマンスを得るためにリポジトリを自動パッキングしています」というメッセージが表示されます。

また、新しいブランチにチェックアウトしてから、前のブランチでリベースを実行してgit gcから、未使用の履歴オブジェクトを削除してからプッシュを実行しましたが、それでもこのメッセージが表示されます。私のリポジトリで何が起こっているのか教えてください。

回答:


305

ショートバージョン:それはそれが言うことを意味し、あなたがそれをただ終わらせれば、すべてがうまくいくでしょう。

リポジトリ内のルーズな(アンパックされた)オブジェクト(プッシュを含む)の数を潜在的に増やす可能性があるほとんどの操作中に、Gitはを呼び出しますgit gc --auto。十分なルーズオブジェクト(デフォルトでは、少なくとも6700)がある場合は、オブジェクトgit repack -d -lをパックするために呼び出されます。個別のパックが多すぎる場合は、1つに再パックされます。

パックは、多数のオブジェクトを含む、デルタ圧縮された単一のファイルです。オブジェクトをパックに格納する方が効率的ですが、オブジェクトをパック(圧縮)するには時間がかかるため、Gitは最初にルーズオブジェクトを作成し、次にバッチでそれらをパックし、次にを自動呼び出ししますgit gc --auto

Gitに再パックを完了させた場合、これはしばらくの間起こりません。特に大きなバイナリオブジェクトがたくさんある場合は特に時間がかかりますが、トリガーされている場合は、リポジトリによって使用されるディスク領域の量が大幅に削減される可能性があります。本当にそうしたくない場合は、configパラメータを変更できますgc.auto。6700をはるかに超える値に増やすと、発生頻度は低くなりますが、発生する時間が長くなります。これを減らしても、現在のリパックを実行する必要がありますが、その後、より頻繁に発生し、より速く終了します。0に設定すると、自動再パッキングが無効になります。

詳細については、man git-gc(下--auto)およびman git-config(下gc.auto)を参照してください。


14
確かに、これには5分ほどかかりましたが、完了しました。すばらしい答えです。
Joshua Pinter

6
私たちはそれがすべてのプッシュで発生しているのを見ています(しばらく数秒かかりますね)。

2
@dpk:通常の状況では発生しないはずです-1回のプッシュのオブジェクト数は、それをトリガーするのに十分な大きさであってはなりません(リポジトリが巨大であるか、大量のコミットをプッシュしている場合を除く)。完了します(完了させますよね?)。理解できない場合は、別の質問をしてください。
Cascabel

6
「Gitを終了させれば」それは可能ですfatal: Out of memory, malloc failed (tried to allocate 79610689 bytes) error: failed to run repack--これは、コードベース全体を1つのgitリポジトリに固定するために得られるものです。アプリを強制終了し、「手動」で強制的に再パックするつもりです
ruffin

11
git pullを実行するたびに取得しています。手動でgit gcを実行しましたが、プルするたびに引き続き発生します。変だ。
バリーケリー

51

Jefroniは正解ですが、自動パッキングが完了するまでに時間が必要な場合もありますが、自動パッキングメッセージがOPで説明されているように数日間続く場合は、この質問で説明されているように、gitのクリーンアップでダングリングオブジェクトが欠落している可能性があります。

ダングリングオブジェクトが自動パッキングに関する継続的なメッセージをトリガーしているかどうかを確認するには、を実行してみてくださいgit fsck。ダングリングコミットの長いリストを取得した場合は、

git gc --prune=now

通常、1回のプルで自動パッキングメッセージが消えない場合は、2〜3か月ごとにリポジトリでこれを実行する必要があります。


5
受け入れられた答えではありませんが、これはまさに私が必要としたものでした。git pull数日にわたってを実行するたびにメッセージが表示され、fsck確かに大量のぶら下がりコミットが表示されました。
ジョーンZaefferer

36

1つのプロジェクトで無効にするには:

cd your_project_dir
git config gc.auto 0

グローバルに無効にするには:

git config --global gc.auto 0

2
私は方法を見つけたと思います:.gitフォルダーに移動し、設定ファイルを開いて、テキスト「auto = 0」を削除して保存します。これで自動パッキングが再び有効になったようです。
エイドリアンキースター2013

18
git config --unset gc.auto
jtatum

10

Gitはgit-repackを実行しています。これは、多くのオブジェクト(=ファイル、コミット、ツリー)を1つのパックファイルにパックします。ヒューリスティックによりスペースが節約される可能性があるとヒューリスティックスが言うとき、Gitは時々これを行います(objects /ディレクトリ内の各ファイルには圧縮された完全なファイルコンテンツが含まれている一方で、パックファイルには圧縮オブジェクトデルタが含まれます)。


2

うまくいけば、そのgit gc --autoステップは今より効率的です(git 2.0.1、2014年6月25日)。NguyễnTháiNgọcDuyによるコミット62aad18を
参照してくださいpclouds

gc --auto:バックグラウンドで参照をロックしません

9f673f9gc:バックグラウンドで--autoを実行するための構成オプション-2014-02-08、Git 2.0.0)はgc --auto、ユーザーの待機時間を短縮するために" "をバックグラウンドで配置します。
ガベージコレクションの一部は、pack-refsとpruning reflogsです。これらは一部の参照をロックする必要があり、同じ参照をロックしようとする他のプロセスを中止する場合があります。

gc --autoがスクリプトの途中で発生した場合、gcがバックグラウンドでロックを保持していると、スクリプトが失敗する可能性があります。これは、9f673f9より前に発生することはありませんでした

並行して実行pack-refsreflog --prune、フォアグラウンドで" "を実行して、並列参照の更新を停止します。残りのバックグラウンド操作(リパック、プルーニング、リアー)は、実行中のgitプロセスに影響を与えません。

Git 2.22(2019年第2四半期)ではさらに最適化されていgit gcます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.