Il libro Git contiene un articolo su ciò che include un indice :
L'indice è un file binario (generalmente conservato .git/index
) contenente un elenco ordinato di nomi di percorso, ciascuno con autorizzazioni e SHA1 di un oggetto BLOB; git ls-files
può mostrarti il contenuto dell'indice:
$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0 .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0 .mailmap
Il problema Racy git fornisce alcuni dettagli in più su quella struttura:
L'indice è una delle strutture di dati più importanti in git.
Rappresenta uno stato dell'albero di lavoro virtuale registrando l'elenco dei percorsi e i relativi nomi di oggetto e funge da area di gestione temporanea per scrivere l'oggetto albero successivo da sottoporre a commit.
Lo stato è "virtuale", nel senso che non deve necessariamente e spesso non corrisponde ai file nell'albero di lavoro.
Per vedere di più, cfr. " git / git / Documentation / technical / index-format.txt ":
Il file di indice Git ha il seguente formato
Tutti i numeri binari sono in ordine di byte di rete.
La versione 2 è descritta qui se non diversamente specificato.
- Un'intestazione di 12 byte composta da:
- Firma a 4 byte :
la firma è {' D
', ' I
', ' R
', ' C
'} (sta per " dircache
")
- Numero di versione a 4 byte :
le versioni attualmente supportate sono 2, 3 e 4.
- Numero a 32 bit di voci di indice.
- Un numero di voci di indice ordinate .
- Estensioni : le
estensioni sono identificate dalla firma.
Le estensioni opzionali possono essere ignorate se Git non le comprende.
Git attualmente supporta l'albero nella cache e risolve le estensioni di annullamento.
- Firma dell'estensione a 4 byte. Se il primo byte è '
A
' .. 'Z
' l'estensione è facoltativa e può essere ignorata.
- Dimensione a 32 bit dell'estensione
- Dati di estensione
- 160-bit SHA-1 sul contenuto del file indice prima di questo checksum.
commenti mljrg :
Se l'indice è il luogo in cui viene preparato il prossimo commit, perché " git ls-files -s
" non restituisce nulla dopo il commit?
Perché l'indice rappresenta ciò che viene monitorato e subito dopo un commit, ciò che viene monitorato è identico all'ultimo commit ( git diff --cached
non restituisce nulla).
Così git ls-files -s
elenca tutti i file tracciati (nome oggetto, bit modalità e numero fase nell'output).
Tale elenco (dell'elemento tracciato) viene inizializzato con il contenuto di un commit.
Quando si cambia ramo, il contenuto dell'indice viene ripristinato al commit a cui fa riferimento il ramo a cui si è appena passati.
Git 2.20 (Q4 2018) aggiunge una tabella di offset degli indici (IEOT) :
Vedi commit 77ff112 , commit 3255089 , commit abb4bb8 , commit c780b9c , commit 3b1d9e0 , commit 371ed0d (10 ott 2018) di Ben Peart ( benpeart
) .
Vedi commit 252d079 (26 set 2018) di Nguyễn Thái Ngọc Duy ( pclouds
) .
(Unita da Junio C Hamano - gitster
- in commit e27bfaa , 19 ott 2018)
ieot: aggiungi l'estensione IEOT (Index Entry Offset Table)
Questa patch consente di affrontare il costo della CPU per il caricamento dell'indice aggiungendo ulteriori dati all'indice che ci consentiranno di eseguire il multithreading efficiente del caricamento e della conversione delle voci della cache.
Ciò si ottiene aggiungendo un'estensione indice (facoltativa) che è una tabella di offset ai blocchi di voci della cache nel file indice.
Per farlo funzionare per gli indici V4, durante la scrittura delle voci della cache, "reimposta" periodicamente la compressione del prefisso codificando la voce corrente come se il nome del percorso per la voce precedente fosse completamente diverso e salvasse l'offset di quella voce nell'IEOT .
Fondamentalmente, con gli indici V4, genera offset in blocchi di voci compresse con prefisso.
Con la nuova impostazione di configurazione index.threads , il caricamento dell'indice è ora più veloce.
Di conseguenza ( utilizzando IEOT ), esegui il commit di 7bd9631 per ripulire la read-cache.c load_cache_entries_threaded()
funzione per Git 2.23 (3 ° trimestre 2019).
Vedere commettere 8373037 , commettere d713e88 , commettere d92349d , commettere 113c29a , commettere c95fc72 , commettere 7a2a721 , commettere c016579 , commettere be27fb7 , commettere 13a1781 , commettere 7bd9631 , commettere 3c1dce8 , commettere cf7a901 , commettere d64db5b , commettere 76a7bc0 (9 maggio 2019) da Jeff King ( peff
) .
(Unito da Junio C Hamano - gitster
- in commit c0e78f7 , 13 giu 2019)
read-cache: elimina il parametro inutilizzato dal caricamento thread
La load_cache_entries_threaded()
funzione accetta un src_offset
parametro che non utilizza. Questo è stato lì sin dal suo inizio in 77ff112 ( read-cache
: carica voci della cache sui thread di lavoro, 10-10-2018, Git v2.20.0-rc0).
Scavando sulla mailing list, quel parametro faceva parte di una precedente iterazione della serie , ma divenne inutile quando il codice passò all'uso dell'estensione IEOT.