сбой выборки git из-за сбоя pack-object
когда я добавляю наш удаленный репозиторий как вверх по течению и пытаюсь его получить, он терпит неудачу, как показано ниже:
$ git fetch upstream
remote: Counting objects: 11901, done.
remote: aborting due to possible repository corruption on the remote side.
error: pack-objects died of signal 9
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the re
mote side.
fatal: protocol error: bad pack header
Я понимаю, что он терпит неудачу из-за наличия огромных файлов в репозитории( который у нас есть) , но почему он не терпит неудачу, когда я клонирую тот же репозиторий? Потому что я могу успешно клонировать репозиторий. Разве одни и те же объекты не должны быть упакованы во время запроса на клонирование?
2 ответов
чтобы немного расширить на VonC это...
во-первых, это может помочь отметить, что signal 9
относится к SIGKILL
и имеет тенденцию возникать, потому что рассматриваемый пульт является хостом Linux, и процесс уничтожается Linux "убийца ООТ" (хотя некоторые системы, отличные от Linux, ведут себя аналогично).
Далее, давайте поговорим об объектах и пакетных файлах. Git "объект" является одним из четырех типов элементов, которые находятся в репозитории git: a "blob "(файл);" дерево "(список Blob, их режимы и их имена, хранящиеся в каталоге: т. е. то, что станет каталогом или папкой при распаковке фиксации);" фиксация "(которая дает автор фиксации, сообщение и дерево верхнего уровня среди других данных); и" тег " (аннотированный тег). Объекты могут храниться как "свободные объекты", причем один объект в файле сам по себе; но они могут занимать много места на диске, поэтому они могут быть вместо этого "упакованы", много объектов в один файл с дополнительными добавлено сжатие.
создание пакета из большого количества свободных объектов, делая это сжатие, является (или, по крайней мере, может быть) cpu - и memory-intensive операция. Объем памяти зависит от числа объектов и их размеров: большие файлы занимают больше памяти. Многие большие файлы занимают много памяти.
далее, как отметил Вонк,git clone
пропускает попытку использовать "тонкие" пакеты (ну, обычно в любом случае). Это означает, что сервер просто доставляет pack-файлы у него уже есть. Это операция "дешевая память": файлы уже существуют, и серверу нужно только доставить их.
С другой стороны, git fetch
пытается, если это возможно, избежать отправки большого количества данных, которые клиент уже имеет. Используя "умный" протокол, клиент и сервер вступают в своего рода разговор, который вы можете думать о чем-то вроде этого:
это может зависеть от протокола, но Documentation/technical/pack-heuristics.txt
указывает на первое различие между clone и fetch.
в другую сторону, принеси,
git-fetch-pack
иgit-clone-pack
вызываетgit-upload-pack
на другом конце (через ssh или разговаривая с демоном).есть два случая:
clone-pack
иfetch-pack
С-k
сохранит загруженный packfile без расширения, поэтому мы не используем тонкую передачу пакета.- в противном случае сгенерированный пакет будет иметь delta без базового объекта в том же пакете.
но
fetch-pack
без-k
взорвет полученный пакет на отдельные объекты, поэтому мы автоматически спрашиваемupload-pack
to дайте нам тонкую пачку еслиupload-pack
поддерживает его.
так что в плане протоколов,Documentation/technical/pack-protocol.txt
иллюстрирует, что выборка может вернуться много данные, чем a git клон.