Das Git-Buch enthält einen Artikel über was ein Index beinhaltet :
Der Index ist eine Binärdatei (im Allgemeinen in .git/index
) mit einer sortierten Liste von Pfadnamen, jeweils mit Berechtigungen und dem SHA1-Wert eines Blob-Objekts; git ls-files
kann Ihnen den Inhalt des Indexes anzeigen:
$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0 .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0 .mailmap
El Rasantes Git-Problem enthält einige weitere Einzelheiten zu dieser Struktur:
Der Index ist eine der wichtigsten Datenstrukturen in Git.
Er repräsentiert einen virtuellen Arbeitsbaumzustand durch die Aufzeichnung einer Liste von Pfaden und deren Objektnamen und dient als Staging Area, um das nächste zu übertragende Baumobjekt zu schreiben.
Der Status ist "virtuell" in dem Sinne, dass er nicht unbedingt mit den Dateien im Arbeitsbaum übereinstimmen muss und dies oft auch nicht tut.
Nov. 2021: siehe auch " Mit dem spärlichen Index von Git kann sich dein Monorepo klein fühlen " aus Derrick Stolee (Microsoft/GitHub)
Der Git-Index ist eine wichtige Datenstruktur in Git. Er dient als "Staging Area" zwischen den Dateien auf Ihrem Dateisystem und Ihrem Commit-Verlauf.
- Wenn Sie
git add
werden die Dateien aus Ihrem Arbeitsverzeichnis mit einem Hashwert versehen und als Objekte im Index gespeichert, so dass es sich um "abgestufte Änderungen" handelt.
- Wenn Sie
git commit
werden die im Index gespeicherten abgestuften Änderungen verwendet, um die neue Übertragung zu erstellen.
- Wenn Sie
git checkout
Git nimmt die Daten aus einer Übertragung und schreibt sie in das Arbeitsverzeichnis und den Index.
Der Index speichert nicht nur Ihre abgestuften Änderungen, sondern auch Dateisysteminformationen über Ihr Arbeitsverzeichnis.
Dadurch kann Git geänderte Dateien schneller melden.
Weitere Informationen finden Sie unter ". git/git/Dokumentation/technisch/index-format.txt ":
Die Git-Indexdatei hat das folgende Format
Alle Binärzahlen sind in Netzwerk-Byte-Reihenfolge.
Version 2 wird hier beschrieben, wenn nicht anders angegeben.
- Ein 12-Byte-Header, bestehend aus:
- 4 Byte Unterschrift :
Die Signatur lautet { ' D
', ' I
', ' R
', ' C
' } (steht für " dircache
")
- 4 Byte Versionsnummer :
Die derzeit unterstützten Versionen sind 2, 3 und 4.
- 32-Bit-Anzahl der Indexeinträge.
- Eine Reihe von sortierten Index-Einträge .
- Erweiterungen :
Erweiterungen werden durch eine Signatur gekennzeichnet.
Optionale Erweiterungen können ignoriert werden, wenn Git sie nicht versteht.
Git unterstützt derzeit gecachte Tree- und Resolve-Rückgängig-Erweiterungen.
- 4-Byte-Erweiterungssignatur. Ist das erste Byte '
A
'..' Z
' ist die Erweiterung optional und kann ignoriert werden.
- 32-Bit-Größe der Erweiterung
- Daten zur Erweiterung
- 160-bit SHA-1 über den Inhalt der Indexdatei vor dieser Prüfsumme.
mljrg Kommentare :
Wenn der Index der Ort ist, an dem die nächste Übertragung vorbereitet wird, warum wird dann nicht " git ls-files -s
" nach der Übergabe nichts zurückgeben?
Denn der Index stellt dar, was verfolgt wird und direkt nach einer Übergabe ist das, was verfolgt wird, identisch mit der letzten Übergabe ( git diff --cached
gibt nichts zurück).
Also git ls-files -s
listet alle verfolgten Dateien auf (Objektname, Modusbits und Stufennummer in der Ausgabe).
Diese Liste (des verfolgten Elements) wird mit dem Inhalt einer Übertragung initialisiert.
Wenn Sie den Zweig wechseln, wird der Indexinhalt auf den Commit zurückgesetzt, auf den der Zweig verweist, zu dem Sie gerade gewechselt haben.
Git 2.20 (Q4 2018) fügt eine Indexeintrag-Offset-Tabelle (IEOT) :
Ver 77ff112 übertragen , Commit 3255089 , abb4bb8 übergeben , c780b9c übergeben , Übergabe 3b1d9e0 , 371ed0d übergeben (10. Okt. 2018) von Ben Peart ( benpeart
) .
Siehe 252d079 festlegen (26. Sep. 2018) von Nguyen Thái Ngoc Duy ( pclouds
) .
(Zusammengefasst von Junio C. Hamano -- gitster
-- en e27bfaa übergeben , 19. Okt. 2018)
ieot: Index Entry Offset Table (IEOT) Erweiterung hinzufügen
Dieser Patch ermöglicht es, die CPU-Kosten für das Laden des Indexes durch Hinzufügen von zusätzliche Daten zum Index hinzugefügt werden, die es uns ermöglichen, das das Laden und die Konvertierung von Cache-Einträgen effizient mit mehreren Threads durchzuführen.
Dies wird erreicht, indem eine (optionale) Indexerweiterung hinzugefügt wird, die eine Tabelle mit Offsets zu Blöcken von Cache-Einträgen in der Indexdatei.
Damit dies für V4-Indizes funktioniert, wird beim Schreiben der Cache-Einträge die Präfix-Komprimierung periodisch "zurückgesetzt", indem der aktuelle Eintrag so kodiert wird, als ob der Pfadname des vorherigen Eintrags völlig anders wäre, und der Offset dieses Eintrags im IEOT.
Grundsätzlich werden bei V4-Indizes Offsets in Blöcken von präfix-komprimierten Einträgen erzeugt.
Mit dem neue index.threads-Konfigurationseinstellung ist das Laden des Index jetzt schneller.
Infolgedessen ( der Verwendung von IEOT ), 7bd9631 festlegen Bereinigung der read-cache.c load_cache_entries_threaded()
Funktion für Git 2.23 (Q3 2019).
Ver festlegen 8373037 , Übergabe d713e88 , Übergabe d92349d , Übergabe 113c29a , c95fc72 übergeben , 7a2a721 festlegen , c016579 festlegen , be27fb7 übergeben , Commit 13a1781 , 7bd9631 festlegen , 3c1dce8 festlegen , cf7a901 festlegen , Übergabe d64db5b , Übergabe 76a7bc0 (09. Mai 2019) von Jeff King ( peff
) .
(Zusammengefasst von Junio C. Hamano -- gitster
-- en c0e78f7 übergeben , 13. Juni 2019)
read-cache: unbenutzte Parameter aus threaded load entfernen
El load_cache_entries_threaded()
Funktion nimmt eine src_offset
Parameter der nicht verwendet wird. Dies ist seit der Einführung des Programms in 77ff112 ( read-cache
: Cache-Einträge auf Worker-Threads laden, 2018-10-10, Git v2.20.0-rc0).
Nachforschungen in der Mailingliste ergaben, dass dieser Parameter Teil einer eine frühere Ausgabe der Serie Sie wurde jedoch überflüssig, als der Code auf die Verwendung der IEOT-Erweiterung umgestellt wurde.
Mit Git 2.29 (Q4 2020) wird die Formatbeschreibung an die jüngsten SHA-256-Arbeiten angepasst.
Ver Übergabe 8afa50a , 0756e61 festlegen , Commit 123712b , Commit 5b6422a (15. August 2020) von Martin Ågren ( none
) .
(Zusammengefasst von Junio C. Hamano -- gitster
-- en Übergabe 74a395c , 19. August 2020)
Abgezeichnet von: Martin Ågren
Dokumentieren Sie, dass wir in SHA-1-Repositorien SHA-1 und in SHA-256-Repositorien SHA-256 verwenden, und ersetzen Sie dann alle anderen Verwendungen von "SHA-1" durch etwas Neutraleres.
Vermeiden Sie es, auf "160-Bit"-Hash-Werte zu verweisen.
technical/index-format
umfasst nun in seinem Manpage :
Alle Binärzahlen sind in Netzwerk-Byte-Reihenfolge.
In einem Repository, das das traditionelle SHA-1 verwendet, werden Prüfsummen und Objekt-IDs (Objektnamen) alle mit SHA-1 berechnet.
Auch in SHA-256-Repositories werden diese Werte mit SHA-256 berechnet.
Sofern nicht anders angegeben, wird hier die Version 2 beschrieben.