Откат репозитория Git не выполняется
У меня есть репозиторий git, который находится на сервере с ограниченной памятью.
Когда я пытаюсь клонировать существующий репозиторий с сервера, я получаю следующую ошибку:
[email protected]:$ git clone ssh://[email protected]/home/hemi/repos/articles
Initialized empty Git repository in /home/hemi/Skrivebord/articles/.git/
[email protected] 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
[email protected]:$
Чтобы справиться с этой ошибкой, я попытался переупаковать исходный репозиторий (согласно этот пост форума). Но вместо переупаковки репозитория он описывает, как использовать команду "git pack-objects".
[email protected]:~/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 установлен на сервере.
Ответы
Ответ 1
У вашего решения есть рабочая копия локально и удаленно, но снова вызовет проблемы, когда удаленный репозиторий решает снова переупаковать себя. К счастью, вы можете установить параметры конфигурации, которые уменьшат объем памяти, необходимый для переупаковки в обоих хранилищах, - это по сути делает параметры командной строки, которые вы добавили в параметры по умолчанию при переупаковке. Таким образом, вы должны войти в систему на удаленном компьютере, внести изменения в репозиторий и выполнить следующие действия:
git config pack.windowMemory 10m
git config pack.packSizeLimit 20m
Возможно, вы захотите сделать то же самое в своем локальном репозитории. (Кстати, я полагаю, что ваш репозиторий очень большой или это машины с небольшой памятью - эти значения кажутся мне очень низкими.)
Для того, что стоит, при сбоях malloc при переупаковке очень больших репозиториев в прошлом я также изменил значения core.packedgitwindowsize
, core.packedgitlimit
, core.deltacachesize
, pack.deltacachesize
, pack.window
и pack.threads
но это звучит так, как будто вам не нужны дополнительные опции:)
Ответ 2
Без прямого доступа к репозиторию и, следовательно, неспособного выполнить переупаковку, выполнение мелкого клона, а затем постепенное извлечение, а увеличение глубины помогло мне.
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
Надеюсь, он все равно может помочь кому-то.
Ответ 3
Я решил проблему, выполнив следующие шаги.
- Получил репозиторий, извлеченный с сервера на мой локальный компьютер (используя исходную копию поверх ssh)
- Переупаковка локального репозитория
git repack -a -d --window-memory 10m --max-pack-size 20m
- Создан пустой репозиторий на сервере
git init --bare
- Выдвинул локальный репозиторий на сервер
- Проверено, что можно клонировать репозиторий сервера
Ответ 4
Это не отвечает на вопрос, но кто-то может столкнуться с этим: на сервере может произойти переупаковка, если 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
. В коде repack используется mmap
для сопоставления некоторого содержимого файлов в памяти, а поскольку убийца памяти недостаточно умен, он учитывает mmapped файлы как используемую память, убивая процесс Git, когда он пытается mmap
создать большой файл.
Решение заключается в компиляции пользовательского двоичного файла Git с отключенной поддержкой mmap
(configure NO_MMAP=1
).
Ответ 5
Я использую git версию 1.7.0.4, и он принимает эту команду. Возможно, что git версия 1.6 не принимает эту команду.
Попробуйте создать новый репозиторий с некоторыми случайными коммитами. Затем переупакуйте его с помощью этой команды.
Ответ 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 клону, используя ssh (я заранее установил ssh-ключи *), например:
git clone https://github.com/USERNAME/REPOSITORYNAME.git
становится:
git clone git @github.com: USERNAME/REPOSITORYNAME.git
*: (Генерация ключа ssh)
ssh-keygen -t rsa -C "[email protected]"
Затем войдите в github, в настройках, импортируйте ssh-ключи и импортируйте его из ~/.ssh/id_rsa.pub.