Книга 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 / Документація / технічний / 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 р.) Від Бена Піарта ( benpeart
) .
Див. Комісію 252d079 (26 вересня 2018 р.) Від Nguyễn Thái Ngọc Duy ( pclouds
) .
(Об’єднав Хуніо С Хамано - gitster
- у комітеті e27bfaa , 19 жовтня 2018 р.)
ieot: додайте розширення таблиці зсуву введення в індекс (IEOT)
Цей патч дозволяє вирішити витрати на процесор завантаження індексу шляхом додавання додаткових даних до індексу, що дозволить нам ефективно багаторазово завантажувати та перетворювати записи кешу.
Це досягається шляхом додавання (необов'язкового) розширення індексу, що є таблицею зсувів до блоків записів кешу у файлі індексу.
Щоб зробити цю роботу для індексів V4, під час запису записів кешу він періодично "скидає" префікс-стиснення, кодуючи поточний запис так, ніби ім'я шляху для попереднього запису зовсім інше і зберігає зміщення цього запису в IEOT .
В основному, за допомогою індексів V4 він генерує зсуви в блоки записів, стиснених префіксом.
З новим параметром конфігурації index.threads зараз завантаження індексу відбувається швидше.
Як результат ( використання IEOT ), виконайте очищення 7bd9631read-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
) .
(Об'єднав Хуніо С Хамано - gitster
- в комітеті c0e78f7 , 13 червня 2019 р.)
read-cache: викинути невикористаний параметр з потокового навантаження
load_cache_entries_threaded()
Функція приймає src_offset
параметр , який він не використовує. Це було з моменту його створення в 77ff112 ( read-cache
: записи кеш-завантаження на робочі потоки, 2018-10-10, Git v2.20.0-rc0).
Копаючись у списку розсилки, цей параметр був частиною попередньої ітерації серії , але став непотрібним, коли код перейшов на використання розширення IEOT.