Книга Git содержит статью о , что включает в себя индекс :
Индекс представляет собой двоичный файл (обычно хранится в .git/index
), содержащий отсортированный список имен путей, каждое из которых имеет разрешения и SHA1 объекта BLOB-объекта; git ls-files
может показать вам содержимое индекса:
$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0 .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0 .mailmap
Задача Racy git дает некоторые дополнительные сведения об этой структуре:
Индекс является одной из наиболее важных структур данных в git.
Он представляет состояние виртуального рабочего дерева путем записи списка путей и имен их объектов и служит промежуточной областью для записи следующего объекта дерева, который будет зафиксирован.
Состояние является «виртуальным» в том смысле, что оно не обязательно должно и часто не совпадает с файлами в рабочем дереве.
Чтобы увидеть больше, ср. " мерзавец / мерзавец / Documentation / технический / индекс-format.txt ":
Файл индекса Git имеет следующий формат
Все двоичные числа расположены в сетевом порядке байтов.
Версия 2 описана здесь, если не указано иное.
- 12-байтовый заголовок, состоящий из:
- 4 байта подпись :
Подпись {{D
',' I
',' R
',' C
'} (расшифровывается как "dircache
")
- 4 байта номер версии :
В настоящее время поддерживаются версии 2, 3 и 4.
- 32-разрядное число записей индекса.
- Количество отсортированных индексных записей .
- Расширения
Расширения идентифицируются по подписи.
Дополнительные расширения можно игнорировать, если Git их не понимает.
Git в настоящее время поддерживает кэшированное дерево и разрешает отмену расширений.
- 4-байтовая подпись расширения. Если первый байт '
A
' .. 'Z
', расширение является необязательным и может быть проигнорировано.
- 32-битный размер расширения
- Расширение данных
- 160-битный SHA-1 поверх содержимого файла индекса до этой контрольной суммы.
mljrg комментарии :
Если индекс - это место, где готовится следующий коммит, почему "git ls-files -s
" ничего не возвращает после коммита?
Поскольку индекс представляет то, что отслеживается , и сразу после коммита то, что отслеживается, совпадает с последним коммитом (git diff --cached
ничего не возвращает).
Итак, git ls-files -s
выводит список всех отслеживаемых файлов (имя объекта, биты режима и номер этапа в выходных данных).
Этот список (отслеживаемых элементов) инициализируется содержимым коммита.
Когда вы переключаете ветку, содержимое индекса сбрасывается до коммита, на который ссылается ветка, на которую вы только что переключились.
Git 2.20 (Q4 2018) добавляет Таблица смещения записи индекса (IEOT) :
См. commit 77ff112 , commit 3255089 , commit abb4bb8 , commit c780b9c , commit 3b1d9e0 , коммит 371ed0d (10 октября 2018 г.) Бен Пирт (benpeart
) .
См. коммит 252d079 (26 сентября 2018 г.) Нгуен Тай Нгок Дуй (pclouds
) .
(Объединено Junio C Hamano - gitster
- в коммит e27bfaa , 19 октября 2018 г.)
ieot: добавить расширение таблицы смещения записи индекса (IEOT)
Этот патч позволяет указать стоимость загрузки индекса процессором, добавив
дополнительные данные к индексу, которые позволят нам эффективно
Поток загрузки и преобразования записей в кэш.
Это достигается путем добавления (необязательного) расширения индекса, которое является
таблица смещений в блоки записей кэша в индексном файле.
Чтобы это работало для индексов V4, при записи записей в кэш он периодически «сбрасывает» префиксное сжатие, кодируя текущую запись, как будто имя пути для предыдущей записи полностью отличается, и сохраняет
смещение этой записи в IEOT.
В основном, с индексами V4, он генерирует смещения в блоки сжатых префиксами записей.
С новой настройкой index.threads загрузка индекса теперь быстрее.
В результате ( использования IEOT ) commit 7bd9631 очистил функцию read-cache.c load_cache_entries_threaded()
для Git 2.23 (Q3 2019).
См. коммит 8373037 , коммит d713e88 , коммит d92349d , коммит 113c29a , коммит c95fc72 , commit 7a2a721 , commit c016579 , commit be27fb7 , commit 13a1781 , commit 7bd9631 , commit 3c1dce8 , commit cf7a901 , commit d64db5b , commit 76a7bc0 (09 мая 2019) Джефф Кинг (peff
) .
(Объединено с Junio C Hamano - gitster
- в коммит c0e78f7 , 13 июня 2019 г.)
read-cache: удалить неиспользуемый параметр из многопоточной загрузки
Функция load_cache_entries_threaded()
принимает параметр src_offset
что он не использует. Это происходит с момента его создания в 77ff112 (read-cache
: загрузка записей кэша в рабочие потоки, 2018-10-10, Git v2.20.0-rc0).
Копирование в списке рассылки, этот параметр был частью более ранней итерации серии , но стал ненужным, когда код переключился на использование расширения IEOT.