16

ここ数日、Git リポジトリへのすべてのプッシュがサーバー上で自動パッキングを引き起こしました。

これが発生したときのクライアントの出力:

~pdr git:master ❯❯❯ git push origin master
Counting objects: 44, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (26/26), done.
Writing objects: 100% (27/27), 4.67 KiB, done.
Total 27 (delta 14), reused 0 (delta 0)
Auto packing the repository for optimum performance.

パッキングはサーバー上で行われ、ps はこれらの git コマンドが動作していることを示します。

git      23252  0.0  0.0  68520   552 ?        S    15:21   0:00 sshd: git@notty  
git      23253  0.0  0.0   9660   540 ?        Ss   15:21   0:00 git shell -c git-receive-pack 'repositories/pdr.git'
git      23254  0.0  0.0  16644  2136 ?        S    15:21   0:00 git receive-pack repositories/pdr.git
git      23258  0.0  0.0   9660   624 ?        S    15:21   0:00 git gc --auto --quiet
git      23261  0.0  0.0   9660   504 ?        S    15:21   0:00 git repack -d -l -q -A
git      23262  0.0  0.0   4104   376 ?        S    15:21   0:00 /bin/sh /usr/lib/git-core/git-repack -d -l -q -A
git      23275  267 92.2 9569724 3742468 ?     Sl   15:21  23:07 git pack-objects --keep-true-parents --honor-pack-keep --non-empty --all --reflog --unpack-unreachable --local -q --delta-base-offset /home/git/repositories/pdr.git/objects/.tmp-23262-pack

サーバー上で手動の「git gc」に続いて「git fsck」を実行しました。エラーメッセージはありませんが、次のプッシュで再び自動パッキングを開始しました。

これは、Git 1.7.0.4 で Ubuntu Server 10.04 LTS を実行しているサーバー上にあります。

4

1 に答える 1

28

Git は、次の 2 つの基準に基づいてgc を自動化するかどうかを決定します。

  1. パックが多すぎませんか?(文字通り、50 以上のファイル.idxin にあり.git/objects/packますか?)
  2. 緩いオブジェクトが多すぎませんか? (文字通り、に27 個以上のファイルが.git/objects/17ありますか?)

何らかの理由で Git がそのディレクトリ内のパック ファイルをマージしたり、ルーズ オブジェクトを削除したりできない場合、次回は再度 auto-gc する必要があると判断します。

上記の 2 つのディレクトリの内容をチェックして、(既定の) 基準が満たされているかどうかを確認し、再パック後に基準が変化するかどうかを確認します。

プロセスを完了できない理由として、次のことが考えられます。

  • 何らかの権限の問題
  • Git のガベージ コレクションによって無視されるか、デフォルトでプルーニングされない未到達オブジェクト
  • gc (リパック) を完了するためのディスク容量が不足しています
  • gc (リパック) を完了するためのメモリが不足しています
  • オブジェクトが大きすぎて指定されたパック サイズに収まりません (git config pack.packSizeLimit既定値は無制限ですが、ユーザーがオーバーライドできるものを参照してください)。

もちろん、gc 関連の調整パラメータが不当に設定されていないことも確認する必要があります。

git config -l | grep gc

その他の詳細については、Git Internalsに関する Git SCM ブックを参照してください。

于 2013-07-29T17:40:21.330 に答える