Что на самом деле делает git, когда говорит, что это «разрешение дельт»? - PullRequest
158 голосов
/ 14 января 2011

Во время первого клона репозитория git сначала получает объекты (что достаточно очевидно), а затем тратит примерно столько же времени на «разрешение дельт». Что на самом деле происходит во время этой фазы клона?

Ответы [ 3 ]

96 голосов
/ 14 января 2011

Этапы git clone:

  1. Получение файла "pack" всех объектов в базе данных репо
  2. Создание файла индекса для полученного пакета
  3. Проверьте ревизию руководителя (очевидно, для репозитория не-голого типа)

«Разрешение дельт» - это сообщение, показанное для второго этапа, индексирование файла пакета («git index-pack ").

Файлы пакета не содержат действительные идентификаторы объектов, только содержимое объекта.Таким образом, чтобы определить идентификаторы объектов, git должен выполнить распаковку + SHA1 для каждого объекта в пакете, чтобы получить идентификатор объекта, который затем записывается в индексный файл.

Объект в файле пакетаможет быть сохранен как дельта, то есть последовательность изменений, чтобы сделать к некоторому другому объекту.В этом случае git необходимо извлечь базовый объект, применить команды и получить результат SHA1.Сам базовый объект может быть получен путем применения последовательности дельта-команд.(Несмотря на то, что в случае клона базовый объект уже встречался, существует ограничение на количество кэшируемых в памяти производимых объектов).

Таким образом, этап «разрешения дельт» включаетраспаковка и контрольная сумма всей базы данных репо, что неудивительно, занимает довольно много времени.Предположительно распаковка и вычисление SHA1 на самом деле занимает больше времени, чем применение дельта-команд.

В случае последующей выборки полученный файл пакета может содержать ссылки (как базы дельта-объектов) на другие объекты, которые получает получательОжидается, что уже есть.В этом случае принимающий git фактически переписывает полученный файл пакета, чтобы включить в него любые такие объекты, на которые ссылаются, так что любой сохраненный файл пакета является самодостаточным.Это может быть то место, где возникло сообщение «Разрешение дельт».

46 голосов
/ 14 января 2011

Git использует дельта-кодирование для хранения некоторых объектов в пакетных файлах. Однако вам не нужно воспроизводить каждое отдельное изменение когда-либо в данном файле, чтобы получить текущую версию, поэтому в Git также иногда хранятся снимки содержимого файла. «Устранение дельт» - это шаг, обеспечивающий согласованность всего этого.

Вот глава из раздела «Git Internals» книги Pro Git, которая доступна в Интернете, где говорится об этом.

4 голосов
/ 07 июля 2011

Янтарь, похоже, описывает объектную модель, которую использует Mercurial или аналогичная. Git хранит не дельты между последующими версиями объекта, а скорее полные снимки объекта каждый раз. Затем он сжимает эти снимки, используя дельта-сжатие, пытаясь найти хорошие дельты для использования, независимо от того, где в истории они существуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...