Książka Git zawiera artykuł o tym, co zawiera indeks :
Indeks jest plikiem binarnym (zwykle przechowywanym w .git/index
) zawierającym posortowaną listę nazw ścieżek, z których każda ma uprawnienia i SHA1 obiektu blob; git ls-files
może pokazać zawartość indeksu:
$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0 .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0 .mailmap
Problem Racy git podaje więcej szczegółów na temat tej struktury:
Indeks jest jedną z najważniejszych struktur danych w git.
Reprezentuje stan wirtualnego drzewa roboczego poprzez rejestrowanie listy ścieżek i nazw ich obiektów i służy jako obszar pomostowy do zapisania następnego obiektu drzewa do zatwierdzenia.
Stan jest „wirtualny” w tym sensie, że niekoniecznie musi, a często nie, zgadza się z plikami w drzewie roboczym.
Aby zobaczyć więcej, por. „ git / git / Documentation / technical / index-format.txt ”:
Plik indeksu Git ma następujący format
Wszystkie liczby binarne są w sieciowej kolejności bajtów.
Wersja 2 jest opisana tutaj, chyba że określono inaczej.
- 12-bajtowy nagłówek składający się z:
- Podpis 4-bajtowy :
podpis to {' D
', ' I
', ' R
', ' C
'} (oznacza „ dircache
”)
- 4-bajtowy numer wersji :
Aktualnie obsługiwane wersje to 2, 3 i 4.
- 32-bitowa liczba pozycji indeksu.
- Liczba posortowanych pozycji indeksu .
- Rozszerzenia :
rozszerzenia są identyfikowane za pomocą podpisu.
Opcjonalne rozszerzenia można zignorować, jeśli Git ich nie rozumie.
Obecnie Git obsługuje buforowane drzewo i rozwiązuje cofanie rozszerzeń.
- 4-bajtowy podpis rozszerzenia. Jeśli pierwszy bajt to „
A
…” Z
, rozszerzenie jest opcjonalne i można je zignorować.
- 32-bitowy rozmiar rozszerzenia
- Dane rozszerzenia
- 160-bitowe SHA-1 nad zawartością pliku indeksu przed tą sumą kontrolną.
mljrg komentarze :
Jeśli indeks jest miejscem, w którym przygotowywana jest następna rewizja, dlaczego " git ls-files -s
" nic nie zwraca po zatwierdzeniu?
Ponieważ indeks reprezentuje to, co jest śledzone , a tuż po zatwierdzeniu, to, co jest śledzone, jest identyczne z ostatnim zatwierdzeniem ( git diff --cached
nic nie zwraca).
Tak więc git ls-files -s
wyświetla wszystkie śledzone pliki (nazwa obiektu, bity trybu i numer etapu na wyjściu).
Ta lista (śledzonych elementów) jest inicjowana treścią zatwierdzenia.
Po przełączeniu gałęzi zawartość indeksu jest resetowana do zatwierdzenia, do którego odwołuje się gałąź, do której właśnie się przełączyłeś.
Git 2.20 (Q4 2018) dodaje tabelę przesunięć indeksu (IEOT) :
Zobacz: commit 77ff112 , commit 3255089 , commit abb4bb8 , commit c780b9c , commit 3b1d9e0 , commit 371ed0d (10 października 2018) przez Ben Peart ( benpeart
) .
Zobacz commit 252d079 (26 września 2018) autorstwa Nguyễn Thái Ngọc Duy ( pclouds
) .
(Scalone przez Junio C Hamano - gitster
- in commit e27bfaa , 19 października 2018)
ieot: dodaj rozszerzenie Index Entry Offset Table (IEOT)
Ta poprawka umożliwia zajęcie się kosztem CPU ładowania indeksu przez dodanie dodatkowych danych do indeksu, które pozwolą nam wydajnie wielowątkowe ładowanie i konwersję wpisów pamięci podręcznej.
Osiąga to poprzez dodanie (opcjonalnego) rozszerzenia indeksu, które jest tabelą offsetów do bloków wpisów pamięci podręcznej w pliku indeksu.
Aby to działało dla indeksów V4, podczas zapisywania wpisów w pamięci podręcznej okresowo „resetuje” kompresję prefiksu, kodując bieżący wpis, tak jakby nazwa ścieżki dla poprzedniego wpisu była zupełnie inna i zapisuje przesunięcie tego wpisu w IEOT .
Zasadniczo w przypadku indeksów V4 generuje przesunięcia w blokach wpisów skompresowanych przedrostkami.
Dzięki nowemu ustawieniu konfiguracji index.threads ładowanie indeksu jest teraz szybsze.
W rezultacie ( używając IEOT ), 7bd9631 oczyści read-cache.c load_cache_entries_threaded()
funkcję dla Git 2.23 (Q3 2019).
Zobacz popełnić 8373037 , popełnić d713e88 , popełnić d92349d , popełnić 113c29a , popełnić c95fc72 , popełnić 7a2a721 , popełnić c016579 , popełnić be27fb7 , popełnić 13a1781 , popełnić 7bd9631 , popełnić 3c1dce8 , popełnić cf7a901 , popełnić d64db5b , popełnić 76a7bc0 (09 maja 2019) przez Jeffa Kinga ( peff
) .
(Scalone przez Junio C Hamano - gitster
- w zatwierdzeniu c0e78f7 , 13 czerwca 2019 r.)
read-cache: usuń nieużywany parametr z ładowania wątkowego
load_cache_entries_threaded()
Funkcja przyjmuje src_offset
parametr, który nie używa. Tak było od jego powstania w 77ff112 ( read-cache
: ładowanie wpisów pamięci podręcznej wątków roboczych, 2018-10-10, Git v2.20.0-rc0).
Kopiąc na liście mailingowej, parametr ten był częścią wcześniejszej iteracji serii , ale stał się niepotrzebny, gdy kod został przełączony na korzystanie z rozszerzenia IEOT.