Co dokładnie zawiera indeks Git i jakiego polecenia mogę użyć, aby wyświetlić zawartość indeksu?
Aktualizacja
Dzięki za wszystkie odpowiedzi. Wiem, że indeks działa jako obszar przemieszczania, a to, co jest zatwierdzane, znajduje się w indeksie, a nie w drzewie roboczym. Jestem po prostu ciekawy, z czego składa się obiekt indeksu. Myślę, że może to być lista nazwa pliku / nazwa katalogu, pary SHA-1, może rodzaj wirtualnego drzewa?
Czy w terminologii Git jest jakieś polecenie hydrauliczne , którego mogę użyć do wyświetlenia zawartości indeksu?
Odpowiedzi:
Książka Git zawiera artykuł o tym, co zawiera indeks :
Problem Racy git podaje więcej szczegółów na temat tej struktury:
Aby zobaczyć więcej, por. „ git / git / Documentation / technical / index-format.txt ”:
Plik indeksu Git ma następujący format
mljrg komentarze :
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)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.)źródło
Analiza krok po kroku
Postanowiłem zrobić małe testy, aby lepiej zrozumieć format i bardziej szczegółowo zbadać niektóre pola.
Wyniki poniżej są takie same dla wersji Git
1.8.5.2
i2.3
.Oznaczyłem punkty, których nie jestem pewien / których nie znalazłem
TODO
: prosimy o uzupełnienie tych punktów.Jak wspominali inni, indeks jest przechowywany pod
.git/index
, a nie jako standardowy obiekt drzewa, a jego format jest binarny i udokumentowany pod adresem : https://github.com/git/git/blob/master/Documentation/technical/index-format. tekstGłówne struktury, które definiują indeks, znajdują się w pliku cache.h , ponieważ indeks jest pamięcią podręczną do tworzenia zatwierdzeń.
Ustawiać
Kiedy zaczynamy repozytorium testowe z:
Na
.git
wygląd katalogu lubię:A jeśli otrzymamy zawartość jedynego obiektu:
Dostajemy
a
. Oznacza to, że:index
punkty do zawartości plików, ponieważgit add b
stworzył obiekt blobanaliza hd
Spójrzmy teraz na sam indeks:
Daje:
Następnie podsumujemy:
Najpierw nagłówek, zdefiniowany pod adresem: struct cache_header :
44 49 52 43
:DIRC
. DO ZROBIENIA: dlaczego jest to konieczne?00 00 00 02
: wersja formatu: 2. Format indeksu ewoluował z czasem. Obecnie istnieje wersja do 4. Format indeksu nie powinien stanowić problemu podczas współpracy między różnymi komputerami na GitHub, ponieważ puste repozytoria nie przechowują indeksu: jest on generowany w czasie klonowania.00 00 00 01
Count plików na index: tylko jeden,b
.Następnie rozpoczyna listę wpisów indeksu, zdefiniowaną przez struct cache_entry Tutaj mamy tylko jeden. Zawiera:
zbiór metadanych plików: 8 bajtów
ctime
, 8 bajtówmtime
, a następnie 4 bajty: urządzenie, i-węzeł, tryb, UID i GID.Zwróć uwagę, jak:
ctime
imtime
są takie same (54 09 76 e6 1d 81 6f c6
), jak oczekiwano, ponieważ nie zmodyfikowaliśmy plikuPierwsze bajty to sekundy od EPOCH w formacie szesnastkowym:
Daje:
I wtedy zrobiłem ten przykład.
Drugie 4 bajty to nanosekundy.
UID i GID to
00 00 03 e8
1000 szesnastkowo: typowa wartość dla konfiguracji jednego użytkownika.Wszystkie te metadane, z których większość nie występuje w obiektach drzewa, pozwalają Gitowi sprawdzić, czy plik szybko się zmienił, bez porównywania całej zawartości.
na początku linii
30
:00 00 00 02
: rozmiar pliku: 2 bajty (a
i\n
odecho
)78 98 19 22 ... c1 99 4e 85
: 20 bajtów SHA-1 w stosunku do poprzedniej treści wpisu. Zauważ, że zgodnie z moimi eksperymentami z zakładaną poprawną flagą , flagi, które po niej występują, nie są uwzględniane w tym SHA-1.Flagi 2-bajtowe:
00 01
1 bit: załóż poprawną flagę. Moje badania wskazują, że ta źle nazwana flaga jest miejscem, w którym
git update-index --assume-unchanged
przechowuje swój stan: https://stackoverflow.com/a/28657085/8952451-bitowa rozszerzona flaga. Określa, czy rozszerzone flagi są obecne, czy nie. Musi być
0
w wersji 2, która nie ma rozszerzonych flag.2-bitowa flaga etapu używana podczas łączenia. Etapy są udokumentowane w
man git-merge
:0
: zwykły plik, nie w konflikcie scalania1
: baza2
: nasz3
: ichPodczas konfliktu scalania wszystkie etapy od 1 do 3 są przechowywane w indeksie, aby umożliwić operacje takie jak
git checkout --ours
.Jeśli tak
git add
, to do indeksu ścieżki zostanie dodany etap 0, a Git będzie wiedział, że konflikt został oznaczony jako rozwiązany. DO ZROBIENIA: sprawdź to.12-bitowa długość ścieżki, która będzie następować::
0 01
tylko 1 bajt od początku ścieżkib
Rozszerzone flagi 2-bajtowe. Ma znaczenie tylko wtedy, gdy „flaga rozszerzona” została ustawiona na flagach podstawowych. DO ZROBIENIA.
62
(ASCIIb
): ścieżka o zmiennej długości. Długość określona w poprzednich flag, tutaj tylko 1 bajtb
.Następnie pojawia się
00
: 1-8 bajtów wypełnienia zerami, tak że ścieżka będzie zakończona znakiem null, a indeks będzie się kończył wielokrotnością 8 bajtów. Dzieje się tak tylko przed wersją indeksu 4.Nie użyto żadnych rozszerzeń. Git wie o tym, ponieważ w pliku nie byłoby wystarczającej ilości miejsca na sumę kontrolną.
Na koniec znajduje się 20-bajtowa suma kontrolna
ee 33 c0 3a .. 09 ab 49 94
nad zawartością indeksu.źródło
git add
, na twojeTODO
: masz rację. Jeśli masz pozycje indeksu wysokiego etapu (konflikt) w danej ścieżce, po przejściu dogit add
tej ścieżki wszystkie pozycje indeksu wysokiego etapu zostaną usunięte, a kopia katalogu roboczego zostanie dodana na etapie0
. (Rozwiązanie konfliktu).Indeks Git to obszar przejściowy między katalogiem roboczym a repozytorium. Możesz użyć indeksu do zbudowania zestawu zmian, które chcesz wspólnie zatwierdzić. Kiedy tworzysz zatwierdzenie, zatwierdzane jest to, co aktualnie znajduje się w tym indeksie, a nie to, co jest w katalogu roboczym.
Aby zobaczyć, co jest w indeksie, wydaj polecenie:
Kiedy uruchomisz status git, możesz zobaczyć, które pliki są w fazie przejściowej (obecnie w twoim indeksie), które są zmodyfikowane, ale jeszcze nie są w fazie przemieszczania, a które całkowicie nie są śledzone.
Możesz przeczytać ten . Wyszukiwarka Google generuje wiele linków, które powinny być dość samowystarczalne.
źródło
git status
nie wyświetla wszystkich plików z indeksu. Zawiera tylko te pliki, które różnią się między indeksem a katalogiem roboczym. Aby zobaczyć wszystkie pliki w indeksie, musisz użyćgit ls-files
.git status
robi się lista plików indeksowych fakt, niezależnie od tego, czy różnią się one między indeksem i WORKDIR.git status
wyświetla listę plików znajdujących się w indeksie, tak, ale nie wyświetla wszystkich plików w indeksie. Wyjaśnienie, jakgit status
faktycznie działa, byłoby korzystną odpowiedzią na pewne pytanie, choć prawdopodobnie nie na to.git status
pokazuje stan drzewa roboczego (różnica między drzewem roboczym a indeksem). W rzeczywistości nie pokazuje indeksu. git-scm.com/docs/git-statusOto, czego dokładnie potrzebujesz, użyj tego polecenia.
$ binwalk index
źródło
Indeks Git to plik binarny (zazwyczaj przechowywany w
.git/index
) zawierający posortowaną listę nazw ścieżek, z których każda ma uprawnienia i SHA1 obiektu blob;git ls-files
może pokazać zawartość indeksu. Zwróć uwagę, że słowaindex
,stage
icache
są tym samym w Git: są używane zamiennie.Indeks Git lub pamięć podręczna Git ma 3 ważne właściwości:
Źródło :
źródło