Что именно содержит индекс Git, и какую команду можно использовать для просмотра содержимого индекса?
Обновить
Спасибо за все ваши ответы. Я знаю, что индекс действует как промежуточная область, и то, что фиксируется, находится в индексе, а не в рабочем дереве. Мне просто интересно, из чего состоит индексный объект. Я предполагаю, что это может быть список имя файла / имя каталога, пары SHA-1, что-то вроде виртуального дерева?
Есть ли в терминологии Git какая-либо сантехническая команда, которую я могу использовать для отображения содержимого индекса?
Ответы:
Книга Git содержит статью о том, что включает в себя индекс :
Проблема Racy git дает более подробную информацию об этой структуре:
Чтобы увидеть больше, ср. " git / git / Documentation / technical / index-format.txt ":
Индексный файл Git имеет следующий формат
mljrg комментарии :
Поскольку индекс представляет то, что отслеживается , и сразу после принятия то, что отслеживается, идентично последнему подтверждению (
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)С новым параметром конфигурации 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)источник
Побитовый анализ
Я решил провести небольшое тестирование, чтобы лучше понять формат и исследовать некоторые области более подробно.
Результаты ниже одинаковы для версий Git
1.8.5.2
и2.3
.Я отметил пункты, в которых я не уверен / не нашел
TODO
: пожалуйста, не стесняйтесь дополнять эти пункты.Как уже упоминалось, индекс хранится в нем
.git/index
, а не в виде стандартного объекта дерева, и его формат является двоичным и задокументирован по адресу: https://github.com/git/git/blob/master/Documentation/technical/index-format. текстОсновные структуры, определяющие индекс, находятся в cache.h , потому что индекс является кешем для создания коммитов.
Настроить
Когда мы запускаем тестовое хранилище с:
В
.git
выглядит каталог нравится:И если мы получим содержимое единственного объекта:
Мы получаем
a
. Это указывает на то, что:index
указывает на содержимое файла, так какgit add b
создается объект блобанализ HD
Теперь давайте посмотрим на сам индекс:
дает:
Далее мы сделаем вывод:
Сначала идет заголовок, определенный в: struct cache_header :
44 49 52 43
:DIRC
. ТОДО: зачем это нужно?00 00 00 02
: версия формата: 2. Формат индекса развивался со временем. В настоящее время существует версия до 4. Формат индекса не должен быть проблемой при взаимодействии между различными компьютерами на GitHub, поскольку голые репозитории не хранят индекс: он создается во время клонирования.00 00 00 01
: количество файлов в индексе: только одинb
,.Далее начинается список записей индекса, определяемых структурой cache_entry. Здесь у нас есть только один. Это содержит:
набор метаданных файла: 8 байт
ctime
, 8 байтmtime
, затем 4 байта: устройство, индекс, режим, UID и GID.Обратите внимание, как:
ctime
иmtime
такие же (54 09 76 e6 1d 81 6f c6
), как и ожидалось, так как мы не изменили файлПервые байты являются секундами после EPOCH в гексе:
дает:
Который, когда я сделал этот пример.
Вторые 4 байта являются наносекундами.
UID и GID равны
00 00 03 e8
1000 в шестнадцатеричном формате: общее значение для однопользовательских настроек.Все эти метаданные, большинство из которых отсутствуют в древовидных объектах, позволяют Git проверять, быстро ли изменился файл, не сравнивая все содержимое.
в начале строки
30
::00 00 00 02
размер файла: 2 байта (a
и\n
изecho
)78 98 19 22 ... c1 99 4e 85
: 20 байт SHA-1 поверх предыдущего содержимого записи. Обратите внимание, что согласно моим экспериментам с предполагаемым допустимым флагом , флаги, которые следуют за ним, не рассматриваются в этом SHA-1.2-байтовые флаги:
00 01
1 бит: принять допустимый флаг. Мои исследования показывают, что этот флаг с плохим именем
git update-index --assume-unchanged
хранит его состояние: https://stackoverflow.com/a/28657085/8952451-битовый расширенный флаг. Определяет, присутствуют ли расширенные флаги или нет. Должно быть
0
в версии 2, у которой нет расширенных флагов.2-битный флаг этапа, используемый во время слияния. Этапы документированы в
man git-merge
:0
: обычный файл, нет конфликта слияния1
: основание2
: наш3
: ихВо время конфликта слияния все этапы 1-3 сохраняются в индексе, чтобы разрешить такие операции, как
git checkout --ours
.Если вы
git add
, то этап 0 добавляется в индекс для пути, и Git будет знать, что конфликт был помечен как разрешенный. ТОДО: проверь это.12-битная длина пути, который будет следовать
0 01
:: только 1 байт, поскольку путь былb
2-байтовые расширенные флаги. Имеет смысл только если «расширенный флаг» был установлен на базовые флаги. ДЕЛАТЬ.
62
(ASCIIb
): путь переменной длины. Длина определяется в предыдущих флагах, здесь всего 1 байтb
.Затем идет
00
: 1-8 байтов заполнения нулями, чтобы путь заканчивался нулем, а индекс заканчивался кратным 8 байтам. Это происходит только до версии 4 индекса.Расширения не использовались. Git знает об этом, потому что в файле не хватит места для контрольной суммы.
Наконец, есть 20-байтовая контрольная сумма
ee 33 c0 3a .. 09 ab 49 94
для содержимого индекса.источник
git add
, по вашемуTODO
: вы правы. Если у вас есть записи индекса верхнего уровня (конфликт) по заданному пути, то приgit add
этом пути все записи индекса верхнего уровня будут удалены, а копия рабочего каталога будет добавлена на этапе0
. (Разрешение конфликта).Индекс Git является промежуточной областью между вашим рабочим каталогом и вашим хранилищем. Вы можете использовать индекс для создания набора изменений, которые вы хотите зафиксировать вместе. Когда вы создаете коммит, то, что фиксируется, это то, что в данный момент находится в этом индексе, а не то, что находится в вашем рабочем каталоге.
Чтобы увидеть, что находится внутри индекса, введите команду:
Когда вы запускаете git status, вы можете видеть, какие файлы размещены (в данный момент в вашем индексе), которые изменены, но еще не подготовлены, а какие полностью не отслежены.
Вы можете прочитать это . Поиск Google выдает много ссылок, которые должны быть достаточно самодостаточными.
источник
git status
не перечисляет все файлы из индекса. В нем перечислены только те файлы, которые отличаются между индексом и рабочим каталогом. Чтобы увидеть все файлы в индексе, вам необходимо использоватьgit ls-files
.git status
делает в списке факт индексных файлов, независимо от того, отличаются ли они между указательным и WORKDIR.git status
перечисляет файлы, которые есть в индексе, да, но не перечисляет все файлы в индексе. Объяснение того, как наgit status
самом деле работает, было бы полезным ответом на некоторый вопрос, хотя, вероятно, не этот.git status
показывает статус рабочего дерева (разница между рабочим деревом и индексом). Это на самом деле не показывает индекс. git-scm.com/docs/git-statusВот что именно вам нужно, используйте эту команду.
$ binwalk index
источник
Git index - это двоичный файл (обычно хранящийся в нем
.git/index
), содержащий отсортированный список имен путей, каждый с правами доступа и SHA1 объекта BLOB-объекта;git ls-files
может показать вам содержимое индекса. Обратите внимание, что словаindex
,stage
иcache
это то же самое в Git: они используются взаимозаменяемоGit index или Git cache имеет 3 важных свойства:
Источник :
источник