Ответ 1
Резюме:
Файлы Git s pack тщательно сконструированы для эффективного использования дисковых кэшей и
обеспечить "хорошие" шаблоны доступа для общих команд и для чтения недавно упомянутых
объекты.
Git s пакетный файл формат довольно гибкий (см. Documentation/technical/pack-format.txt, или Packfile в Git Community Book). Файлы пакетов хранят объекты в двух основных Способы: "неинтегрированные" (берут данные исходного объекта и сбрасывают-сжимают это) или "deltified" (сформировать дельта против какого-либо другого объекта, тогда deflate-compress результирующие данные дельта). Объекты, хранящиеся в пакет может быть в любом порядке (они не обязательно (обязательно) должны быть сортировка по типу объекта, имени объекта или любому другому атрибуту) и деликатные объекты могут быть сделаны против любого другого подходящего объекта того же типа.
КомандаGit s pack-objects использует несколько heuristics для обеспечить отличную местность ссылок для общих команды. Эти эвристики управляют как выбором базы объекты для дефинированных объектов и порядок объектов. каждый механизм в основном независим, но они разделяют некоторые цели.
Git образует длинные цепочки дельта-сжатых объектов, но
эвристика пытается убедиться, что только "старые" объекты находятся на концах
длинные цепочки. Кэш дельта-базы (размер которого контролируется
core.deltaBaseCacheLimit
) автоматически
и может значительно сократить количество "перестроек", необходимых для
команды, которым необходимо прочитать большое количество объектов (например, git log
-p
).
Эвристика компрессии дельта
Типичный репозиторий Git хранит очень большое количество объектов, поэтому он не может разумно сравнить их все, чтобы найти пары (и цепей), которые будут давать наименьшие дельта-представления.
Эвристика выбора дельта-базы основана на идее, что хорошие дельта-базы будут найдены среди объектов с похожими именами файлов и размеров. Каждый тип объекта обрабатывается отдельно (то есть объект одного типа никогда не будет использоваться в качестве базы дельта для объект другого типа).
Для целей выбора дельта-базы объекты сортируются (в первую очередь) на имя файла, а затем размер. Окно в этот отсортированный список используется для ограничения количество объектов, которые рассматриваются как потенциальные базы дельта. Если для объекта не найдено "достаточно хорошее" 1 среди объектов в его окне, то объект не будет дельта сжатый.
Размер окна контролируется опцией --window=
git pack-objects
или переменной конфигурации pack.window
.
максимальная глубина дельта-цепи контролируется --depth=
опции git pack-objects
или конфигурации pack.depth
переменная. Опция --aggressive
git gc
значительно расширяет
как размер окна, так и максимальная глубина, чтобы попытаться создать
файл меньшего пакета.
Сортировка имени файла объединяет объекты для записей с помощью
идентичные имена (или, по меньшей мере, аналогичные окончания (например, .c
)). Размер
сортировка от самого большого до самого маленького, так что дельта, которая удаляет данные,
предпочитают дельтам, которые добавляют данные (поскольку удаление дельтов короче
представления) и так, что более ранние, более крупные объекты (обычно
новее), как правило, представлены с простым сжатием.
1 То, что квалифицируется как "достаточно хорошее", зависит от размера рассматриваемого объекта и его потенциальной дельта-базы, а также от того, насколько глубокой будет ее конечная цепочка дельты.
Эквивалент объекта
Объекты хранятся в файлах пакетов в "последней ссылке", заказ. Объекты, необходимые для восстановления самой последней истории, размещенные ранее в пакете, и они будут близко друг к другу. Эта обычно хорошо работает для кэшей дисков ОС.
Все объекты фиксации сортируются по дате фиксации (последнее последнее)
и хранятся вместе. Это размещение и заказ оптимизируют диск
доступа, необходимые для прохождения графика истории и извлечения основного коммита
информации (например, git log
).
Объекты tree и blob хранятся, начиная с дерева из сначала сохраненный (последний) фиксация. Каждое дерево обрабатывается на глубине первая мода, хранение любых объектов, которые еще не были сохраняются. Это ставит все деревья и капли, необходимые для реконструкции последние совершают вместе в одном месте. Любые деревья и капли, которые еще не были сохранены, но которые необходимы для последующих совершений, являются сохраненный далее, в упорядоченном порядке фиксации.
Окончательное упорядочение объектов слегка зависит от выбора дельта-базы в том случае, если объект выбран для дельта-представления и его базового объекта еще не сохранен, тогда его базовый объект хранится непосредственно перед самого децитированного объекта. Это предотвращает появление ошибок в кэше диска из-за нелинейный доступ, необходимый для чтения базового объекта, который "естественно" был бы сохраненные позже в файле пакета.