Das Git-Buch enthält einen Artikel darüber, was ein Index enthält :
Der Index ist eine Binärdatei (im Allgemeinen gespeichert .git/index
), die eine sortierte Liste von Pfadnamen mit jeweils Berechtigungen und dem SHA1 eines Blob-Objekts enthält. git ls-files
kann Ihnen den Inhalt des Index zeigen:
$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0 .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0 .mailmap
Das Racy-Git-Problem enthält einige weitere Details zu dieser Struktur:
Der Index ist eine der wichtigsten Datenstrukturen in Git.
Es stellt einen virtuellen Arbeitsbaumstatus dar, indem eine Liste von Pfaden und deren Objektnamen aufgezeichnet wird, und dient als Bereitstellungsbereich zum Ausschreiben des nächsten festzuschreibenden Baumobjekts.
Der Status ist "virtuell" in dem Sinne, dass er nicht unbedingt mit den Dateien im Arbeitsbaum übereinstimmen muss und häufig nicht übereinstimmt.
Um mehr zu sehen, vgl. " git / git / Documentation / technisch / index-format.txt ":
Die Git-Indexdatei hat das folgende Format
Alle Binärzahlen sind in Netzwerkbyte-Reihenfolge.
Version 2 wird hier beschrieben, sofern nicht anders angegeben.
- Ein 12-Byte-Header bestehend aus:
- 4-Byte- Signatur :
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 von Indexeinträgen.
- Eine Reihe von sortierten Indexeinträgen .
- Erweiterungen :
Erweiterungen werden durch Signatur identifiziert.
Optionale Erweiterungen können ignoriert werden, wenn Git sie nicht versteht.
Git unterstützt derzeit zwischengespeicherten Baum und löst Rückgängig-Erweiterungen auf.
- 4-Byte-Erweiterungssignatur. Wenn das erste Byte '
A
' .. ' Z
' ist, ist die Erweiterung optional und kann ignoriert werden.
- 32-Bit-Größe der Erweiterung
- Erweiterungsdaten
- 160-Bit-SHA-1 über den Inhalt der Indexdatei vor dieser Prüfsumme.
mljrg Kommentare :
Wenn der Index der Ort ist, an dem das nächste Commit vorbereitet wird, warum gibt " git ls-files -s
" nach dem Commit nichts zurück?
Da der Index darstellt, was verfolgt wird , und direkt nach einem Commit, ist das, was verfolgt wird, identisch mit dem letzten Commit ( git diff --cached
gibt nichts zurück).
So git ls-files -s
listet alle Dateien aufgespürt (Objektnamen, Modusbits und Stufenzahl in der Ausgabe).
Diese Liste (des verfolgten Elements) wird mit dem Inhalt eines Commits initialisiert.
Wenn Sie den Zweig wechseln, wird der Indexinhalt auf das Commit zurückgesetzt, auf das der Zweig verweist, zu dem Sie gerade gewechselt haben.
Git 2.20 (Q4 2018) fügt eine Indexeintrags-Offset-Tabelle (IEOT) hinzu :
Siehe Commit 77ff112 , Commit 3255089 , Commit abb4bb8 , Commit c780b9c , Commit 3b1d9e0 , Commit 371ed0d (10. Oktober 2018) von Ben Peart ( benpeart
) .
Siehe Commit 252d079 (26. September 2018) von Nguyễn Thái Ngọc Duy ( pclouds
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit e27bfaa , 19. Oktober 2018)
ieot: IEOT-Erweiterung (Index Entry Offset Table) hinzufügen
Mit diesem Patch können Sie die CPU-Kosten für das Laden des Index beheben, indem Sie dem Index zusätzliche Daten hinzufügen, mit denen wir das Laden und Konvertieren von Cache-Einträgen effizient multithreading können.
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 ist.
Damit dies für V4-Indizes funktioniert, wird beim Schreiben der Cache-Einträge die Präfixkomprimierung regelmäßig "zurückgesetzt", indem der aktuelle Eintrag so codiert wird, als ob der Pfadname für den vorherigen Eintrag völlig anders wäre, und der Offset dieses Eintrags im IEOT gespeichert wird .
Grundsätzlich werden bei V4-Indizes Offsets in Blöcken von vorfixkomprimierten Einträgen generiert.
Mit der neuen Konfigurationseinstellung index.threads ist das Laden des Index jetzt schneller.
Als Ergebnis ( bei Verwendung von IEOT ) bereinigen Sie 7bd9631 die read-cache.c load_cache_entries_threaded()
Funktion für Git 2.23 (Q3 2019).
Sehen Sie verpflichten 8373037 , begehen d713e88 , begehen d92349d , begehen 113c29a , begehen c95fc72 , begehen 7a2a721 , begehen c016579 , begehen be27fb7 , begehen 13a1781 , begehen 7bd9631 , begehen 3c1dce8 , begehen cf7a901 , begehen d64db5b , begehen 76a7bc0 (9. Mai 2019) von Jeff King ( peff
) .
(Zusammengeführt von Junio C Hamano - gitster
- in Commit c0e78f7 , 13. Juni 2019)
Lese-Cache: Nicht verwendete Parameter aus der Thread-Last löschen
Die load_cache_entries_threaded()
Funktion verwendet einen src_offset
Parameter, den sie nicht verwendet. Dies ist seit seiner Einführung in 77ff112 vorhanden ( read-cache
: Laden von Cache-Einträgen in Worker-Threads, 2018-10-10, Git v2.20.0-rc0).
Dieser Parameter war Teil einer früheren Iteration der Serie , wurde jedoch unnötig, als der Code auf die Verwendung der IEOT-Erweiterung umgestellt wurde.