Почему git запускает автоматическую упаковку при каждом нажатии на наш репо?

Последние несколько дней каждое нажатие на наш репозиторий 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: [email protected]  
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" на сервере. Нет сообщений об ошибках, но при следующем нажатии он снова начал автоматическую упаковку.

Это на сервере с Ubuntu Server 10.04 LTS с git 1.7.0.4.

Ответ 1

Git решает, следует ли авто gc на основе двух критериев:

Если по какой-либо причине Git не может объединить файлы пакета или удалить свободные объекты в этом каталоге, он подумает, что в следующий раз ему нужно будет автоматически-gc.

Я бы проверил содержимое двух приведенных выше каталогов, чтобы узнать, соблюдены ли критерии (по умолчанию), и посмотреть, изменились ли критерии после повторной упаковки.

Некоторые причины неспособности завершить процесс могут быть следующими:

  • какая-то проблема с разрешениями
  • недоступные объекты, которые игнорируются командой Git сбор мусора или не обрезаны по умолчанию из-за их молодости
  • недостаточно места на диске для завершения gc (repack)
  • недостаточная память для завершения gc (repack)
  • слишком большие, чтобы соответствовать размеру указанного пакета (см. git config pack.packSizeLimit, который по умолчанию не ограничен, но может быть переопределен пользователем)

Вы также должны убедиться, что настраиваемые параметры, связанные с gc, не были установлены необоснованно, посмотрев на:

git config -l | grep gc

Дополнительные сведения см. в книге Git SCM на Git Внутренние версии.