Во время первого клона репозитория git сначала получает объекты (что достаточно очевидно), а затем тратит примерно столько же времени на «разрешение дельт». Что на самом деле происходит во время этой фазы клона?
Во время первого клона репозитория git сначала получает объекты (что достаточно очевидно), а затем тратит примерно столько же времени на «разрешение дельт». Что на самом деле происходит во время этой фазы клона?
Ответы:
Git использует дельта-кодирование для хранения некоторых объектов в пакетных файлах. Тем не менее, вы не хотите , чтобы воспроизвести каждое изменение когда - либо на данный файл, чтобы получить текущую версию, поэтому Git также случайные снимки содержимого файлов , хранящееся , а также. «Устранение дельт» - это шаг, обеспечивающий согласованность всего этого.
Вот глава из раздела «Git Internals» книги Pro Git, которая доступна в Интернете, где говорится об этом.
git gcлибо всякий раз, когда Git сочтет это необходимым), Git сжимает все «свободные» файлы в файл пакета, чтобы сэкономить место, и файл индекса в этот файл пакета будет создан. Таким образом, zlib будет сжимать свой собственный дельта-алгоритм, но Git использует дельта-кодирование для хранения предыдущих версий. Поскольку наиболее распространенным и частым доступом является последняя версия, она сохраняется в виде снимка.
Этапы git clone:
«Разрешение дельт» - это сообщение, отображаемое на втором этапе, индексирующее файл пакета («git index-pack»).
Файлы пакета не имеют реальных идентификаторов объектов, только содержимое объекта. Таким образом, чтобы определить идентификаторы объектов, git должен выполнить декомпрессию + SHA1 для каждого объекта в пакете, чтобы получить идентификатор объекта, который затем записывается в индексный файл.
Объект в файле пакета может быть сохранен как дельта, то есть последовательность изменений, чтобы сделать к некоторому другому объекту. В этом случае git необходимо извлечь базовый объект, применить команды и получить результат SHA1. Сам базовый объект может быть получен путем применения последовательности дельта-команд. (Несмотря на то, что в случае клона базовый объект уже встречался, существует ограничение на количество кешируемых объектов в памяти).
Таким образом, стадия «разрешения дельт» включает распаковку и контрольную сумму всей базы данных репо, что неудивительно, что занимает довольно много времени. Предположительно распаковка и вычисление SHA1 на самом деле занимает больше времени, чем применение дельта-команд.
В случае последующей выборки полученный файл пакета может содержать ссылки (в качестве базисов дельта-объектов) на другие объекты, которые, как ожидается, уже получит получающий git. В этом случае принимающий git фактически переписывает полученный файл пакета, чтобы включить в него любые такие объекты, на которые ссылаются, так что любой сохраненный файл пакета является самодостаточным. Это может быть там, где возникло сообщение «Разрешение дельт».
Янтарь, кажется, описывает объектную модель, которую использует Mercurial или аналогичные. Git хранит не дельты между последующими версиями объекта, а скорее полные снимки объекта каждый раз. Затем он сжимает эти снимки с использованием дельта-сжатия, пытаясь найти хорошие дельты для использования, независимо от того, где в истории они существуют.