3

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

Counting objects: 460, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (367/367), done.
remote: fatal: pack has bad object at offset 1641: inflate returned -5
error: pack-objects died of signal 13
error: failed to push some refs to 'ssh://christoph@111.111.111.111/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'

Как видите, доступ к хранилищу осуществляется через ssh. (Я изменил IP-адрес.)

Я пробовал несколько раз, но получил ту же ошибку (даже с теми же номерами). Затем я решил создать новый репозиторий, удалив папку старого, создав папку с тем же именем и выполнив внутри нее git init --bare .

Теперь я получаю эту ошибку при нажатии на нее:

Counting objects: 3129, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2265/2265), done.
remote: fatal: pack has bad object at offset 426983445: inflate returned -5
error: pack-objects died of signal 13
error: failed to push some refs to 'ssh://christoph@111.111.111.111/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'

В чем проблема и как мне заставить его работать снова?

Я запускаю git версии 1.9.1 на 64-битной машине Linux с ядром 3.19.


Обновление с дополнительным выводом:

laptop-14-04:~/Documents Container$ GIT_TRACE=1 git push --porcelain --progress --recurse-submodules=check origin refs/heads/master:refs/heads/master
trace: built-in: git 'push' '--porcelain' '--progress' '--recurse-submodules=check' 'origin' 'refs/heads/master:refs/heads/master'
trace: run_command: 'ssh' 'christoph@111.111.111.111' 'git-receive-pack '\''/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'\'''
christoph@111.111.111.111's password: 
trace: run_command: 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
trace: exec: 'git' 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
trace: built-in: git 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
Counting objects: 3383, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2257/2257), done.
remote: fatal: pack has bad object at offset 426983770: inflate returned -5
error: pack-objects died of signal 13
error: failed to push some refs to 'ssh://christoph@111.111.111.111/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'

laptop-14-04:~/Documents Container$ git count-objects -Hv
count: 0
size: 0 bytes
in-pack: 3452
packs: 1
size-pack: 13.03 GiB
prune-packable: 0
garbage: 0
size-garbage: 0 bytes

laptop-14-04:~/Documents Container$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (3452/3452), done.
laptop-14-04:~/Documents Container$ git gc
Counting objects: 3452, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2254/2254), done.
Writing objects: 100% (3452/3452), done.
Total 3452 (delta 915), reused 3452 (delta 915)

laptop-14-04:~/Documents Container$ git push --porcelain --progress --recurse-submodules=check origin refs/heads/master:refs/heads/master
christoph@111.111.111.111's password: 
Counting objects: 3383, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2257/2257), done.
remote: fatal: pack has bad object at offset 426983770: inflate returned -5
error: pack-objects died of signal 13
error: failed to push some refs to 'ssh://christoph@111.111.111.111/media/christoph/afacc396-ec79-4920-9105-513ca4616c06/git/Documents'

Теперь я установил новую ОС (Ubuntu 16.04 64 bit, работающая под ядром 4.4.0-21), и теперь git версии 2.7.4. Я не копировал старый репо в новую систему, а только скопировал его содержимое и создал новый репо. Кроме того, я удалил репо на своем Raspberry Pi и создал новое голое репо на нем. Теперь я использовал SmartGit для добавления файлов в репозиторий и для попытки его подтолкнуть. Тем не менее, проблема все еще существует:

Снимок экрана: ошибка SmartGit.


Это работает, если я создаю пустой репозиторий локально, добавляю его как удаленный, а затем нажимаю на него. Затем я могу перенести каталог репозитория в Raspberry Pi и использовать его как удаленный через ssh. Таким образом, похоже, что проблема возникает только при передаче большого количества данных (или, возможно, больших коммитов) по сети.

1 ответ1

2

pack-objects (man git-pack-objects) умерли из-за сигнала 13 (сломанный канал), потому что git не смог накачать (распаковать) объект, и произошел сбой с ошибкой (код ошибки -5 может означать « out-of-mem» или ошибка перезаписи / перекрытия).

объяснение

Согласно руководству zlib, ошибки определяются следующим образом:

#define Z_OK            0
#define Z_STREAM_END    1
#define Z_NEED_DICT     2
#define Z_ERRNO        (-1)
#define Z_STREAM_ERROR (-2)
#define Z_DATA_ERROR   (-3)
#define Z_MEM_ERROR    (-4)
#define Z_BUF_ERROR    (-5)
#define Z_VERSION_ERROR (-6)

где -5 означает, что прогресс невозможен или если в буфере вывода недостаточно места.

Z_BUF_ERROR если прогресс невозможен или если в буфере вывода недостаточно места при использовании Z_FINISH . Обратите внимание, что Z_BUF_ERROR не является фатальным, и inflate() может быть вызван снова с большим входным и большим выходным пространством для продолжения распаковки.

Вот что мы можем прочитать в zlib FAQ:

Перед тем, как сделать вызов, убедитесь, что avail_in и avail_out не равны нулю. При установке параметра flush равным Z_FINISH , также убедитесь, что в качестве значения vend_out достаточно обработки всех ожидающих вводимых данных. Обратите внимание, что Z_BUF_ERROR не является фатальным - другой вызов deflate() или inflate() может быть сделан с большим количеством входного или выходного пространства. Z_BUF_ERROR может быть неизбежен в зависимости от того, как используются функции, поскольку невозможно определить, есть ли еще ожидающий вывод, когда strm.avail_out возвращается с нулем. См. Zlib Usage Example для сильно аннотированного примера.


Решение

Это может быть связано с несколькими вещами:

  • толкаемый объект слишком велик, поэтому zlib занимает память, поэтому вам нужно больше места в выходном буфере zlib,

    В этом случае попробуйте увеличить http.postBuffer, например

    git config http.postBuffer 134217728 # =~ 128MB
    

    В качестве альтернативы используйте bfg для удаления больших пятен, например

    java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
    
  • ваш объект поврежден, поэтому запустите git fsck --full и git gc

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

  • может быть ошибкой git, так как она не должна прерываться на Z_BUF_ERROR , но чтобы обеспечить больше выходного пространства или больше ввода, смотрите: zLib inflate() зависает при распаковке буфера

    Вы можете сообщить об ошибке git в список рассылки.

  • может быть проблема с gzip-наддувом (например, это ошибка в методе gzip-наддува?)

  • может быть ошибка старого ядра (<= 2.6.32-rc4), поэтому обновите ядро

    Смотрите: Ошибка # 547503: git-core: "git clone" не работает на armel

    Единственное, возможно, соответствующее изменение ядра, которое я смог найти, это зафиксировать 5a3a29f (ARM: 5691/1: исправить проблемы с псевдонимами в кэше между kmap () и kmap_atomic () с помощью highmem, зафиксировать 7929eb9 восходящем направлении) из 2.6.31.1. Поэтому, хотя у меня тоже есть сомнения, нам может повезти. msg00049


Другие полезные команды для рассмотрения:


Смотрите также:


Здесь отсутствует соответствующий код Git (builtin/index-pack.c):

git_inflate_init(&stream);
stream.next_out = buf;
stream.avail_out = buf == fixed_buf ? sizeof(fixed_buf) : size;

do {
    unsigned char *last_out = stream.next_out;
    stream.next_in = fill(1);
    stream.avail_in = input_len;
    status = git_inflate(&stream, 0);
    use(input_len - stream.avail_in);
    if (sha1)
        git_SHA1_Update(&c, last_out, stream.next_out - last_out);
    if (buf == fixed_buf) {
        stream.next_out = buf;
        stream.avail_out = sizeof(fixed_buf);
    }
} while (status == Z_OK);
if (stream.total_out != size || status != Z_STREAM_END)
    bad_object(offset, _("inflate returned %d"), status);
git_inflate_end(&stream);

и git_inflate() из zlib.c

status = inflate(&strm->z,
         (strm->z.avail_in != strm->avail_in)
         ? 0 : flush);

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .