2011-01-28 2 views
53

У меня есть репозиторий 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]'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 
[email protected]:$ 

Для обработки этой ошибки я пытался упакуйте оригинальный репозиторий (в соответствии с this forum post). Но вместо переупаковки репозитория он описывает, как использовать команду 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 установлен на сервере.

ответ

94

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

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

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

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

+2

Спасибо за настройки конфигурации, я раньше их не знал. Репозиторий содержит большой набор PDF-файлов. Общий размер репозитория (включая каталог .git и отслеживаемые файлы) соответствует 1,1 ГБ. Поэтому я думаю, что это большой репозиторий ;-) – midtiby

+0

@MarkLongair: ты спас мой день сэра! Я собирался запустить в магазин и купить обновление RAM: D –

+0

@MarkLongair: Отличный ответ !!! Спасибо за такую ​​полезную информацию. – nish

1

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

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

+0

Вы говорите об этой команде? 'git repack -a -d --window-memory 10m - max-pack-size 100m' – Flimm

15

Я решил проблему, выполнив следующие шаги.

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

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

+0

Спасибо, это работа – VolArt

5

Это не дает ответа на вопрос, но кто-то может запустите его: переупаковка может также потерпеть неудачу на сервере, когда 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).

+0

Знаете ли вы, можно ли добавить NO_MMAP = 1 в существующую установку git? –

+1

Я так не думаю, что это выглядит как макрос препроцессора, который приводит к созданию другого кода. Но это просто мнение, я не исследовал его. – zoul

16

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

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 

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

+0

как последнее средство для большой работы, это действительно сработало. Благодарю. –

+1

'git clone REPO --depth = 1' все еще не удался для меня с ошибкой' remote: прерывание из-за возможного повреждения репозитория на удаленной стороне. ' – Flimm

0

У меня была такая же проблема: на 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 

Мое решение было, мерзавец клон с помощью SSH (я настраивал ключи SSH * заранее), как это:

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

становится:

мерзавец клон [email protected]: ИМЯ_ПОЛЬЗОВАТЕЛЯ/REPOSITORYNAME.git

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

SSH-кейген -t RSA -C "[email protected]"

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

+0

Я слышал о корпоративных маршрутизаторах, выполняющих сканирование содержимого и удаление соединений для HTTP, но никогда HTTPS - ваш декодирует и повторно шифрует трафик HTTPS? – Rup

+0

Rup: ​​Перед выходом в Интернет есть два маршрутизатора. На следующей неделе я буду точно проверять, как настроить эту конкретную компанию. Я проверял, так как это никуда не денется (любая другая сеть wifi), только в этой конкретной компании. – arcol

Смежные вопросы