Was enthält der Git-Index genau und mit welchem Befehl kann ich den Inhalt des Index anzeigen?
Aktualisieren
Vielen Dank für alle Ihre Antworten. Ich weiß, dass der Index als Staging-Bereich fungiert, und was festgeschrieben wird, befindet sich im Index und nicht im Arbeitsbaum. Ich bin nur neugierig, woraus ein Indexobjekt besteht. Ich denke, es könnte eine Liste von Dateinamen / Verzeichnisnamen, SHA-1-Paaren, vielleicht eine Art virtueller Baum sein?
Gibt es in der Git-Terminologie einen Installationsbefehl , mit dem ich den Inhalt des Index auflisten kann?
Antworten:
Das Git-Buch enthält einen Artikel darüber, was ein Index enthält :
Das Racy-Git-Problem enthält einige weitere Details zu dieser Struktur:
Um mehr zu sehen, vgl. " git / git / Documentation / technisch / index-format.txt ":
Die Git-Indexdatei hat das folgende Format
mljrg Kommentare :
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)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)quelle
Stück für Stück Analyse
Ich habe beschlossen, ein wenig zu testen, um das Format besser zu verstehen und einige Bereiche genauer zu untersuchen.
Die folgenden Ergebnisse sind für Git-Versionen
1.8.5.2
und gleich2.3
.Ich habe Punkte markiert, bei denen ich mir nicht sicher bin / die ich nicht gefunden habe
TODO
: Bitte ergänzen Sie diese Punkte.Wie bereits erwähnt, wird der Index unter
.git/index
und nicht als Standardbaumobjekt gespeichert. Sein Format ist binär und dokumentiert unter: https://github.com/git/git/blob/master/Documentation/technical/index-format. TXTDie Hauptstrukturen, die den Index definieren, befinden sich in cache.h , da der Index ein Cache zum Erstellen von Commits ist.
Konfiguration
Wenn wir ein Test-Repository starten mit:
Das
.git
Verzeichnis sieht folgendermaßen aus:Und wenn wir den Inhalt des einzigen Objekts erhalten:
Wir bekommen
a
. Dies zeigt an, dass:index
verweist auf den Dateiinhalt, dagit add b
ein Blob-Objekt erstellt wurdeHD-Analyse
Schauen wir uns nun den Index selbst an:
Gibt:
Als nächstes werden wir schließen:
Zuerst kommt der Header, definiert unter: struct cache_header :
44 49 52 43
:DIRC
. TODO: Warum ist das notwendig?00 00 00 02
: format version: 2. Das Indexformat hat sich im Laufe der Zeit weiterentwickelt. Derzeit gibt es eine Version bis 4. Das Format des Index sollte bei der Zusammenarbeit zwischen verschiedenen Computern auf GitHub kein Problem darstellen, da nackte Repositorys den Index nicht speichern: Er wird zum Zeitpunkt des Klonens generiert.00 00 00 01
: Anzahl der Dateien im Index: nur eine ,b
.Als nächstes beginnt eine Liste von Indexeinträgen , die durch struct cache_entry definiert sind. Hier haben wir nur einen. Es beinhaltet:
Eine Reihe von Dateimetadaten: 8 Byte
ctime
, 8 Bytemtime
, dann 4 Byte: Gerät, Inode, Modus, UID und GID.Beachten Sie, wie:
ctime
undmtime
sind die gleichen (54 09 76 e6 1d 81 6f c6
) wie erwartet, da wir die Datei nicht geändert habenDie ersten Bytes sind Sekunden seit EPOCH in hex:
Gibt:
Zu diesem Zeitpunkt habe ich dieses Beispiel gemacht.
Die zweiten 4 Bytes sind Nanosekunden.
UID und GID sind
00 00 03 e8
1000 in hex: ein allgemeiner Wert für Einzelbenutzer-Setups.Mit all diesen Metadaten, von denen die meisten nicht in Baumobjekten vorhanden sind, kann Git überprüfen, ob sich eine Datei schnell geändert hat, ohne den gesamten Inhalt zu vergleichen.
am Anfang der Zeile
30
:00 00 00 02
: Dateigröße: 2 Bytes (a
und\n
vonecho
)78 98 19 22 ... c1 99 4e 85
: 20 Byte SHA-1 über dem vorherigen Inhalt des Eintrags. Beachten Sie, dass gemäß meinen Experimenten mit dem angenommenen gültigen Flag die darauf folgenden Flags in diesem SHA-1 nicht berücksichtigt werden.2-Byte-Flags:
00 01
1 Bit: Gültiges Flag annehmen. Meine Untersuchungen zeigen, dass in dieser schlecht benannten Flagge
git update-index --assume-unchanged
der Status gespeichert ist : https://stackoverflow.com/a/28657085/8952451 Bit erweitertes Flag. Legt fest, ob die erweiterten Flags vorhanden sind oder nicht. Muss
0
auf Version 2 sein, die keine erweiterten Flags hat.2-Bit-Stufenflag, das beim Zusammenführen verwendet wird. Etappen sind dokumentiert in
man git-merge
:0
: reguläre Datei, nicht in einem Zusammenführungskonflikt1
: Basis2
: unsere3
: ihreWährend eines Zusammenführungskonflikts werden alle Phasen von 1 bis 3 im Index gespeichert, um Operationen wie z
git checkout --ours
.Wenn Sie
git add
, wird dem Index für den Pfad eine Stufe 0 hinzugefügt, und Git weiß, dass der Konflikt als gelöst markiert wurde. TODO: Überprüfen Sie dies.12-Bit-Länge des folgenden Pfads ::
0 01
1 Byte nur seit dem Pfadb
2 Byte erweiterte Flags. Nur sinnvoll, wenn das "erweiterte Flag" für die Basisflags gesetzt wurde. MACHEN.
62
(ASCIIb
): Pfad variabler Länge. Länge in den vorherigen Flags bestimmt, hier nur 1 Byte ,b
.Dann kommt ein
00
: 1-8 Bytes mit Null-Auffüllung, so dass der Pfad nullterminiert wird und der Index mit einem Vielfachen von 8 Bytes endet. Dies geschieht nur vor der Indexversion 4.Es wurden keine Erweiterungen verwendet. Git weiß das, weil in der Datei nicht mehr genügend Platz für die Prüfsumme vorhanden ist.
Schließlich gibt es eine 20-Byte-Prüfsumme
ee 33 c0 3a .. 09 ab 49 94
über den Inhalt des Index.quelle
git add
auf IhreTODO
: Sie sind richtig. Wenn Sie über einen bestimmten Pfad über hochrangige Indexeinträge (einen Konflikt) verfügen, werden beigit add
diesem Pfad alle übergeordneten Indexeinträge entfernt und die Arbeitsverzeichniskopie wird schrittweise hinzugefügt0
. (Lösung des Konflikts).Der Git-Index ist ein Staging-Bereich zwischen Ihrem Arbeitsverzeichnis und Ihrem Repository. Mit dem Index können Sie eine Reihe von Änderungen erstellen, die Sie gemeinsam festschreiben möchten. Wenn Sie ein Commit erstellen, wird festgeschrieben, was sich derzeit in diesem Index befindet und nicht in Ihrem Arbeitsverzeichnis.
Geben Sie den folgenden Befehl ein, um zu sehen, was sich im Index befindet:
Wenn Sie den Git-Status ausführen, können Sie sehen, welche Dateien (derzeit in Ihrem Index) bereitgestellt werden, welche geändert, aber noch nicht bereitgestellt wurden und welche vollständig nicht verfolgt werden.
Sie können lesen diese . Eine Google-Suche wirft viele Links auf, die ziemlich autark sein sollten.
quelle
git status
listet nicht alle Dateien aus dem Index auf. Es werden nur die Dateien aufgelistet, die sich zwischen Index und Arbeitsverzeichnis unterscheiden. Um alle Dateien im Index anzuzeigen, müssen Sie verwendengit ls-files
.git status
listet tatsächlich Indexdateien auf, unabhängig davon, ob sie sich zwischen Index und Arbeitsverzeichnis unterscheiden.git status
listet Dateien auf, die sich im Index befinden, ja, listet jedoch nicht alle Dateien im Index auf. Zu erklären, wie esgit status
tatsächlich funktioniert, wäre eine nützliche Antwort auf eine Frage, wenn auch wahrscheinlich nicht auf diese.git status
Zeigt den Status des Arbeitsbaums an (Unterschied zwischen Arbeitsbaum und Index). Der Index wird nicht angezeigt. git-scm.com/docs/git-statusHier ist, was Sie genau benötigt, verwenden Sie diesen Befehl.
$ binwalk index
quelle
Der Git-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. Bitte beachten Sie, dass Worteindex
,stage
undcache
dasselbe ist in Git: sie werden austauschbar verwendet.Der Git-Index oder Git-Cache hat drei wichtige Eigenschaften:
Quelle :
quelle