Перепаковка репозитория Git не удалась - PullRequest
57 голосов
/ 28 января 2011

У меня есть git-репозиторий, расположенный на сервере с ограниченной памятью.Когда я пытаюсь клонировать существующий репозиторий с сервера, я получаю следующую ошибку

hemi@ubuntu:$ git clone ssh://hemi@servername.dk/home/hemi/repos/articles
Initialized empty Git repository in /home/hemi/Skrivebord/articles/.git/
hemi@servername.dk's password: 
remote: Counting objects: 666, done.
remote: warning: suboptimal pack - out of memory
remote: fatal: Out of memory, malloc failed
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed
hemi@ubuntu:$ 

Чтобы справиться с этой ошибкой, я попытался перепаковать оригинальный репозиторий (согласно этому сообщению на форуме ),Но вместо переупаковки репозитория описывается, как использовать команду «git pack-objects».

hemi@servername:~/repos/articles$ git repack -a -d --window-memory 10m --max-pack-size 100m
usage: git pack-objects [{ -q | --progress | --all-progress }]
        [--all-progress-implied]
        [--max-pack-size=N] [--local] [--incremental]
        [--window=N] [--window-memory=N] [--depth=N]
        [--no-reuse-delta] [--no-reuse-object] [--delta-base-offset]
        [--threads=N] [--non-empty] [--revs [--unpacked | --all]*]
        [--reflog] [--stdout | base-name] [--include-tag]
        [--keep-unreachable | --unpack-unreachable 
        [<ref-list | <object-list]

На сервере установлен Git 1.6.5.7.

Ответы [ 6 ]

105 голосов
/ 28 января 2011

Ваше решение предоставило вам рабочую копию локально и удаленно, но снова вызовет проблемы, когда удаленный репозиторий решит заново упаковать себя.К счастью, вы можете установить параметры конфигурации, которые уменьшат объем памяти, необходимый для перепаковки в обоих репозиториях - это по существу делает параметры командной строки, которые вы добавили в параметры по умолчанию при перепаковке.Итак, вы должны войти в систему на удаленном компьютере, перейти в хранилище и сделать:

git config pack.windowMemory 10m
git config pack.packSizeLimit 20m

Вы можете сделать то же самое в своем локальном хранилище.(Между прочим, я предполагаю, что либо ваш репозиторий очень большой, либо это машины с небольшим объемом памяти - эти значения кажутся мне очень низкими.)

Для чего стоит, когда вы получаете сбои malloc при перепаковке очень больших репозиториев в прошлом, я также изменил значения core.packedgitwindowsize, core.packedgitlimit, core.deltacachesize, pack.deltacachesize, pack.window и pack.threads, но звучит так, как будто вам не нужно никакихдополнительные опции:)

22 голосов
/ 11 августа 2013

Без прямого доступа к хранилищу и, следовательно, невозможности выполнить перепаковку, мне помогло выполнение мелкого клона, а затем постепенное извлечение при увеличении глубины.

git clone YOUR_REPO --depth=1
git fetch --depth=10
...
git fetch --depth=100
git fetch --unshallow    //Downloads all history allowing to push from repo

Надеюсь, это все еще может кому-то помочь.

15 голосов
/ 28 января 2011

Я решил проблему, выполнив следующие действия:

  1. Получил хранилище с сервера на мою локальную машину (используя необработанную копию через ssh)
  2. Перепаковал локальный хранилище
    git repack -a -d --window-memory 10m --max-pack-size 20m
  3. Создан пустой репозиторий на сервере
    git init --bare
  4. Передал локальный репозиторий на сервер
  5. Проверено, что возможноклонировать репозиторий сервера
5 голосов
/ 05 октября 2011

Это не отвечает на вопрос, но кто-то может столкнуться с ним: перепаковка может также произойти сбой на сервере, когда pack-objects завершается каким-либо убийцей памяти (например, тот, который используется на Dreamhost):

$ git clone project-url project-folder
Cloning into project-folder...
remote: Counting objects: 6606, done.
remote: Compressing objects: 100% (2903/2903), done.
error: pack-objects died of signal 9284.51 MiB | 2.15 MiB/s   
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed

На Dreamhost это, кажется, вызвано mmap.Код переупаковки использует mmap для отображения содержимого некоторых файлов в память, и поскольку убийца памяти недостаточно умен, он считает mmapped файлы как использованную память, убивая процесс Git при попытке mmap большого файла.

Решение состоит в том, чтобы скомпилировать пользовательский двоичный файл Git с отключенной поддержкой mmap (configure NO_MMAP=1).

1 голос
/ 28 января 2011

Я использую git версии 1.7.0.4, и она принимает эту команду.Вполне возможно, что git версии 1.6 не принимает эту команду.

Попробуйте создать новый репозиторий с некоторыми случайными коммитами.Затем перепакуйте его этой командой.

0 голосов
/ 28 апреля 2015

У меня была такая же проблема на Ubuntu 14.10 с git 2.1.0 в частном репозитории github.com. (Подозревается маршрутизатор Entreprise! Работает в другой сети Wi-Fi, кроме как на рабочем месте)

* GnuTLS recv error (-54): Error in the pull function.
* Closing connection 2jects:  31% (183/589)   
error: RPC failed; result=56, HTTP code = 200
fatal: The remote end hung up unexpectedly
fatal: protocol error: bad pack header

Мое решение состояло в том, чтобы сделать git clone с помощью ssh (я заранее установил ssh-ключи *), например:

мерзавец клон https://github.com/USERNAME/REPOSITORYNAME.git

становится:

git clone git@github.com: ИМЯ ПОЛЬЗОВАТЕЛЯ / REPOSITORYNAME.git

*: (Генерация ключа SSH)

ssh-keygen -t rsa -C "your_email_address_registered_with_github@domain.com"

Затем войдите в github, в настройках, импортируйте ключи ssh и импортируйте его из ~ / .ssh / id_rsa.pub.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...