Книга Git содержит статью о том, что включает в себя индекс :
Индекс представляет собой двоичный файл (обычно хранящийся в нем .git/index
), содержащий отсортированный список имен путей, каждый с разрешениями и SHA1 объекта BLOB-объекта; git ls-files
может показать вам содержимое индекса:
$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0 .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0 .mailmap
Проблема Racy git дает более подробную информацию об этой структуре:
Индекс является одной из самых важных структур данных в git.
Он представляет состояние виртуального рабочего дерева путем записи списка путей и имен их объектов и служит промежуточной областью для записи следующего объекта дерева, который будет зафиксирован.
Состояние является «виртуальным» в том смысле, что оно не обязательно должно и часто не совпадает с файлами в рабочем дереве.
Чтобы увидеть больше, ср. " git / git / Documentation / technical / index-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) :
См. Коммит 77ff112 , коммит 3255089 , коммит abb4bb8 , коммит c780b9c , коммит 3b1d9e0 , коммит 371ed0d (10 октября 2018 г.) от Ben Peart ( benpeart
) .
См. Коммит 252d079 (26 сентября 2018 г.) Нгуена Тхая Нгука Дуй ( pclouds
) .
(Слиты Junio C Hamano - gitster
- в фиксации e27bfaa , 19 октября 2018)
ieot: добавить расширение таблицы смещения записи индекса (IEOT)
Этот патч позволяет решить проблему загрузки индекса процессором, добавив к нему дополнительные данные, что позволит нам эффективно выполнять многопоточную загрузку и преобразование записей кэша.
Это достигается путем добавления (необязательного) расширения индекса, которое представляет собой таблицу смещений, к блокам записей кэша в файле индекса.
Чтобы это работало для индексов V4, при записи записей в кэш он периодически «сбрасывает» сжатие префиксов, кодируя текущую запись, как будто имя пути для предыдущей записи полностью отличается, и сохраняет смещение этой записи в IEOT. ,
В основном, с индексами V4, он генерирует смещения в блоки сжатых префиксами записей.
С новым параметром конфигурации index.threads загрузка индекса теперь быстрее.
В результате ( с использованием IEOT ), совершают 7bd9631 очистку вверх read-cache.c load_cache_entries_threaded()
функцию для Git 2.23 (Q3 2019).
См совершать 8373037 , совершать d713e88 , совершают d92349d , совершают 113c29a , совершают c95fc72 , совершают 7a2a721 , совершают c016579 , совершают be27fb7 , совершают 13a1781 , совершают 7bd9631 , совершают 3c1dce8 , совершают cf7a901 , совершают d64db5b , совершают 76a7bc0 (09 мая 2019) от Jeff King ( 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.