Gitリポジトリに問題があります。最後の数日間、サーバーへのプッシュを行うたびに、「最適なパフォーマンスを得るためにリポジトリを自動的にパックします」というメッセージが表示されます。これは消えてシェルを返さないようです。
また、新しいブランチにチェックアウトし、前のブランチをリベースして、git gc
を使用して未使用の履歴オブジェクトを削除し、プッシュを実行しましたが、このメッセージが表示されます。リポジトリで何が起こっているのか教えてください。
ショートバージョン:それはそれが言うことを意味し、あなたがそれを終わらせるだけなら、すべてがうまくいくでしょう。
リポジトリ内の緩い(アンパックされた)オブジェクトの数(プッシュを含む)を潜在的に増やす可能性のあるほとんどの操作中に、Gitはgit gc --auto
を呼び出します。十分な数のオブジェクト(デフォルトでは少なくとも6700)がある場合、git repack -d -l
を呼び出してそれらをパックします。別々のパックが多すぎる場合、それらを1つに再パックします。
パックは、多数のオブジェクトを含むデルタ圧縮された単一ファイルです。オブジェクトをパックに保存する方が効率的ですが、オブジェクトをパック(圧縮)するのに時間がかかるため、Gitは最初にゆるいオブジェクトを作成し、git gc --auto
の自動呼び出しを介して時々バッチでパックします。
Gitに再パッキングを終了させた場合、これはしばらくは再び起こりません。特に大きなバイナリオブジェクトが多数ある場合、実際に時間がかかることがありますが、トリガーしている場合は、おそらくリポジトリによって使用されるディスク容量を大幅に削減することを示します。本当にそうしたくない場合は、構成パラメーターgc.auto
を変更できます。 6700をはるかに超える値に増やすと、発生頻度は低くなりますが、時間がかかるようになります。減らすと、現在の再パックを行う必要がありますが、その後はより頻繁に発生し、より早く終了します。 0に設定すると、自動再パッキングが無効になります。
詳細については、man git-gc
(--auto
の下)およびman git-config
(gc.auto
の下)を参照してください。
Jefroniは正しいですが、自動パッキングは完了するのに時間がかかることもありますが、OPで説明されているように自動パッキングメッセージが複数日にわたって続く場合、gitのクリーンアップでぶら下がりオブジェクトが欠落している可能性があります this質問 。
ぶら下がりオブジェクトが自動パッキングに関する継続的なメッセージをトリガーしているかどうかを確認するには、git fsck
を実行してみてください。ダングリングコミットの長いリストを取得した場合は、次のようにしてクリーンアップできます。
git gc --Prune=now
通常、1回のプルで自動パッキングメッセージが消えない場合は、2〜3か月ごとにリポジトリでこれを実行する必要があります。
1つのプロジェクトを無効にするには:
cd your_project_dir
git config gc.auto 0
グローバルに無効にするには:
git config --global gc.auto 0
Gitはgit-repackを実行しており、多くのオブジェクト(=ファイル、コミット、ツリー)を1つのパックファイルにパックします。 Gitはこれを行う場合があります。ヒューリスティックがスペースを節約できると言ったとき(パックファイルには圧縮されたオブジェクトデルタが含まれ、objects /ディレクトリの各ファイルには圧縮された完全なファイルコンテンツが含まれます)
うまくいけば、そのgit gc --auto
ステップがより効率的になった(git 2.0.1、2014年6月25日)。
commit 62aad18 を参照してください NguyễnTháiNgọcDuy(pclouds
)
gc --auto
:バックグラウンドで参照をロックしません9f673f9 (
gc
:バックグラウンドで--autoを実行するための設定オプション-2014-02-08、Git 2.0.0)は、ユーザーの待機時間を短縮するために "gc --auto
"をバックグラウンドに配置します。
ガベージコレクションの一部は、pack-refとプルーニングreflogです。これらはいくつかのrefをロックする必要があり、同じrefをロックしようとする他のプロセスを中止する場合があります。
gc --auto
がスクリプトの途中で起動されると、gcがバックグラウンドでロックを保持しているため、 9f673f9 の前にスクリプトが失敗する可能性があります。フォアグラウンドで
pack-refs
と "reflog --Prune
"を実行し続けて、並列参照更新を停止します。残りのバックグラウンド操作(再パック、プルーン、およびrerere)は、実行中のgitプロセスに影響を与えません。
Git 2.22(Q2 2019) さらに最適化git gc
。