Перепаковка репозитория Git не удалась
У меня есть 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 установлен на сервере.
9 ответов
Ваше решение предоставило вам рабочую копию локально и удаленно, но снова вызовет проблемы, когда удаленный репозиторий решит заново упаковать себя. К счастью, вы можете установить параметры конфигурации, которые уменьшат объем памяти, необходимый для перепаковки в обоих репозиториях - это по существу делает параметры командной строки, которые вы добавили в параметры по умолчанию при перепаковке. Итак, вы должны авторизоваться на удаленном компьютере, перейти в хранилище и выполнить:
git config pack.windowMemory 10m
git config pack.packSizeLimit 20m
Вы можете сделать то же самое в вашем локальном хранилище. (Между прочим, я думаю, что ваш репозиторий очень большой или это машины с небольшим объемом памяти - эти значения кажутся мне очень низкими.)
Для чего стоит, когда в прошлом возникали сбои malloc при перепаковке очень больших репозиториев, я также менял значения core.packedgitwindowsize
, core.packedgitlimit
, core.deltacachesize
, pack.deltacachesize
, pack.window
а также pack.threads
но это звучит так, как будто вам не нужны дополнительные параметры:)
Без прямого доступа к хранилищу и, следовательно, неспособности выполнить перепаковку, мне помогло выполнение мелкого клона, а затем постепенное извлечение при увеличении глубины.
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
Надеюсь, это все еще может помочь кому-то.
Я решил проблему, используя следующие шаги.
- Получил репозиторий с сервера на мою локальную машину (используя сырую копию через ssh)
- Перепаковал локальный репозиторий
git repack -a -d --window-memory 10m --max-pack-size 20m
- Создал пустой репозиторий на сервере
git init --bare
- Перенес локальный репозиторий на сервер
- Проверено, что можно клонировать репозиторий сервера
Это не отвечает на вопрос, но кто-то может столкнуться с этим: перепаковка может также произойти сбой на сервере, когда 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
).
Я использую GIT версии 1.7.0.4, и он принимает эту команду. Возможно, что git версии 1.6 не принимает эту команду.
Попробуйте создать новый репозиторий с несколькими случайными коммитами. Затем перепакуйте его этой командой.
У меня была такая же проблема на 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-ключи *), например:
будет выглядеть так:
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.
В моем случае изменение этих значений конфигурации не помогло — GIT все равно вылетал с несколько другими ошибками.
Помогла простая перезагрузка сервера (в моем случаеsudo shutdown -r now
). Похоже, что-то съедало много оперативной памяти на сервере, поэтому GIT не смог выделить память.
Надеюсь, это тоже кому-то поможет.
В моем случае у меня было такое же сообщение об ошибке, но проблема была на стороне Github.
Примерно через час технического обслуживания они исправили это, и проблема была решена на всех машинах.