gitformat-commit-graph
Имя
gitformat-commit-graph - Формат графа коммитов Git
Синопсис
$GIT_DIR/objects/info/commit-graph $GIT_DIR/objects/info/commit-graphs/*
Описание
Граф коммитов Git хранит список OID коммитов и некоторую связанную метаданные, включая:
-
Номер поколения коммита.
-
OID корневого дерева.
-
Дата коммита.
-
Родители коммита, хранящиеся с помощью позиционных ссылок в файле графа.
-
Фильтр Блума коммита, содержащий пути, изменённые между коммитом и его первым родителем, если запрошено.
Эти позиционные ссылки хранятся как целые числа без знака 32 бита, соответствующие позиции в массиве списка OID коммитов. Из-за некоторых специальных констант, используемых для отслеживания родителей, мы можем хранить не более (1 << 30) + (1 << 29) + (1 << 28) - 1 (около 1,8 миллиарда) коммитов.
Формат файлов графа коммитов:
Для возможности расширений, добавляющих дополнительные данные в граф, мы организуем тело в «блоки» и предоставляем двоичную таблицу поиска в начале тела. Заголовок включает определённые значения, такие как количество блоков и тип хеша.
Все многобайтовые числа находятся в сетевом порядке байтов.
ЗАГОЛОВОК:
4-byte signature:
The signature is: {'C', 'G', 'P', 'H'} 1-byte version number:
Currently, the only valid version is 1. 1-byte Hash Version
We infer the hash length (H) from this value:
1 => SHA-1
2 => SHA-256
If the hash type does not match the repository's hash algorithm, the
commit-graph file should be ignored with a warning presented to the
user. 1-byte number (C) of "chunks"
1-byte number (B) of base commit-graphs
We infer the length (H*B) of the Base Graphs chunk
from this value. ТАБЛИЦА ПОИСКА БЛОКОВ:
(C + 1) * 12 bytes listing the table of contents for the chunks:
First 4 bytes describe the chunk id. Value 0 is a terminating label.
Other 8 bytes provide the byte-offset in current file for chunk to
start. (Chunks are ordered contiguously in the file, so you can infer
the length using the next chunk position if necessary.) Each chunk
ID appears at most once. The CHUNK LOOKUP matches the table of contents from the chunk-based file format, see gitformat-chunk[5]
The remaining data in the body is described one chunk at a time, and these chunks may be given in any order. Chunks are required unless otherwise specified.
ДАННЫЕ БЛОКОВ:
OID Распределение (ID: {O, I, D, F}) (256 * 4 байта)
The ith entry, F[i], stores the number of OIDs with first byte at most i. Thus F[255] stores the total number of commits (N).
OID Поиск (ID: {O, I, D, L}) (N * H байт)
The OIDs for all commits in the graph, sorted in ascending order.
Данные коммита (ID: {C, D, A, T }) (N * (H + 16) байт)
-
Первые H байт предназначены для OID корневого дерева.
-
Следующие 8 байт предназначены для позиций первых двух родителей i-го коммита. Хранит значение 0x70000000, если родителя нет в этой позиции. Если существует более двух родителей, второе значение имеет установленный старший бит, а остальные биты хранят позицию массива в блоке списка дополнительных рёбер.
-
Следующие 8 байт хранят топологический уровень (номер поколения v1) коммита и время коммита в секундах с момента эпохи. Номер поколения использует старшие 30 бит первых 4 байт, а время коммита использует 32 бита вторых 4 байт, вместе с 2 младшими битами младшего байта, хранящими 33-й и 34-й биты времени коммита.
Данные поколения (ID: {G, D, A, 2 }) (N * 4 байта) [Необязательно]
-
Этот список из 4-байтовых значений хранит скорректированные смещения даты коммита для коммитов, расположенных в том же порядке, что и блок данных коммита.
-
Если скорректированное смещение даты коммита не может быть хранится в 31 бите, значение имеет установленный старший бит, а остальные биты хранят позицию скорректированного смещения даты в блоке переполнения данных поколения.
-
Блок данных поколения присутствует только тогда, когда файл графа коммитов написан совместимыми версиями Git и в случае цепочек графов коммитов, разделённых слоями, верхний слой также содержит блок данных поколения.
Переполнение данных поколения (ID: {G, D, O, 2 }) [Необязательно]
-
Этот список из 8-байтовых значений хранит скорректированные смещения даты коммита для коммитов со скорректированными смещениями даты, которые не могут быть сохранены в 31 бите.
-
Блок переполнения данных поколения присутствует только тогда, когда присутствует блок данных поколения и по крайней мере одно скорректированное смещение даты коммита не может быть сохранено в 31 бите.
Список дополнительных рёбер (ID: {E, D, G, E}) [Необязательно]
This list of 4-byte values store the second through nth parents for all octopus merges. The second parent value in the commit data stores an array position within this list along with the most-significant bit on. Starting at that array position, iterate through this list of commit positions for the parents until reaching a value with the most-significant bit on. The other bits correspond to the position of the last parent.
Индекс фильтра Блума (ID: {B, I, D, X}) (N * 4 байта) [Необязательно]
-
i-й элемент, BIDX[i], хранит количество байтов во всех фильтрах Блума от коммита 0 до коммита i (включительно) в лексикографическом порядке. Фильтр Блума для i-го коммита охватывает от BIDX[i-1] до BIDX[i] (плюс длина заголовка), где BIDX[-1] равен 0.
-
Блок BIDX игнорируется, если блок BDAT отсутствует.
Данные фильтра Блума (ID: {B, D, A, T}) [Необязательно]
-
Он начинается с заголовка, состоящего из трёх целых чисел без знака 32 бита:
-
Версия алгоритма хеширования, используемого. В настоящее время мы поддерживаем значение 2, которое соответствует 32-битной версии хеширования murmur3, реализованной точно так, как описано в https://en.wikipedia.org/wiki/MurmurHash#Algorithm, и технике двойного хеширования с использованием значений начальных параметров 0x293ae76f и 0x7e646e2, как описано в https://doi.org/10.1007/978-3-540-30494-4_26 «Фильтры Блума в вероятностной проверке». Фильтры Блума версии 1 содержат ошибку, которая появляется, когда char является знаковым, и хранилище содержит имена путей с символами >= 0x80; Git поддерживает их чтение и запись, но эта возможность будет удалена в будущих версиях Git.
-
Количество раз, когда путь хешируется, и, следовательно, количество битовых позиций, которые кумулятивно определяют, присутствует ли файл в коммите.
-
Минимальное количество бит
bна запись в фильтре Блума. Если фильтр содержитnзаписей, то размер фильтра — минимальное количество 64-битовых слов, содержащих n*b битов.
-
-
Остальная часть блока — конкатенация всех вычисленных фильтров Блума для коммитов в лексикографическом порядке.
-
Примечание: коммиты без изменений или с более чем 512 изменениями имеют фильтры Блума длиной один, с либо всеми битами, установленными в ноль, либо в единицу соответственно.
-
Блок BDAT присутствует тогда и только тогда, когда присутствует блок BIDX.
Список базовых графов (ID: {B, A, S, E}) [Необязательно]
This list of H-byte hashes describe a set of B commit-graph files that form a commit-graph chain. The graph position for the ith commit in this file's OID Lookup chunk is equal to i plus the number of commits in all base graphs. If B is non-zero, this chunk must exist.
ТРЕЙЛЕР:
H-byte HASH-checksum of all of the above.
Исторические заметки:
В блоках данных поколения (GDA2) и переполнения данных поколения (GDO2) содержится число 2 в их идентификаторах блоков, так как предыдущая версия Git записывала, возможно, ошибочные данные в этих блоках с идентификаторами «GDAT» и «GDOV». Изменением идентификаторов более новые версии Git проигнорируют эти более старые блоки и запишут новую информацию, не доверяя неверным данным.
gitformat-commit-graph
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/gitformat-commit-graph