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