Que contient exactement l'index Git et quelle commande puis-je utiliser pour afficher le contenu de l'index?
Mettre à jour
Merci pour toutes vos réponses. Je sais que l'index agit comme une zone de transit et que ce qui est validé se trouve dans l'index plutôt que dans l'arbre de travail. Je suis simplement curieux de savoir en quoi consiste un objet index. Je suppose que cela pourrait être une liste de nom de fichier / nom de répertoire, des paires SHA-1, une sorte d'arbre virtuel peut-être?
Existe-t-il, dans la terminologie Git, une commande de plomberie que je puisse utiliser pour lister le contenu de l'index?
Réponses:
Le livre Git contient un article sur ce qu'un index comprend :
Le problème git Racy donne plus de détails sur cette structure:
Pour en savoir plus, cf. " git / git / Documentation / technical / index-format.txt ":
Le fichier d'index Git a le format suivant
commentaires mljrg :
Comme l'index représente ce qui est suivi , et juste après une validation, ce qui est suivi est identique à la dernière validation (
git diff --cached
ne renvoie rien).Répertorie donc
git ls-files -s
tous les fichiers suivis (nom de l'objet, bits de mode et numéro d'étape dans la sortie).Cette liste (des éléments suivis) est initialisée avec le contenu d'un commit.
Lorsque vous changez de branche, le contenu de l'index est réinitialisé au commit référencé par la branche vers laquelle vous venez de basculer.
Git 2.20 (Q4 2018) ajoute une table de décalage d'entrée d'index (IEOT) :
Voir commit 77ff112 , commit 3255089 , commit abb4bb8 , commit c780b9c , commit 3b1d9e0 , commit 371ed0d (10 octobre 2018) par Ben Peart (
benpeart
) .Voir commit 252d079 (26 septembre 2018) par Nguyễn Thái Ngọc Duy (
pclouds
) .(Fusionné par Junio C Hamano -
gitster
- dans commit e27bfaa , 19 oct 2018)Avec le nouveau paramètre de configuration index.threads , le chargement de l'index est désormais plus rapide.
En conséquence ( de l'utilisation d'IEOT ), validez 7bd9631 pour nettoyer la
read-cache.c load_cache_entries_threaded()
fonction pour Git 2.23 (Q3 2019).Voir le commit 8373037 , le commit d713e88 , le commit d92349d , le commit 113c29a , le commit c95fc72 , le commit 7a2a721 , le commit c016579 , le commit be27fb7 , le commit 13a1781 , le commit 7bd9631 , le commit 3c1dce8 , le commit cf7a901 , le commit d64db5b , le commit de Jeff King
peff
(09 mai 2019) ( ) .(Fusionné par Junio C Hamano -
gitster
- in commit c0e78f7 , 13 juin 2019)la source
Analyse bit par bit
J'ai décidé de faire un petit test pour mieux comprendre le format et rechercher certains des domaines plus en détail.
Les résultats ci-dessous sont les mêmes pour les versions Git
1.8.5.2
et2.3
.J'ai marqué des points avec lesquels je ne suis pas sûr / que je n'ai pas trouvé
TODO
: n'hésitez pas à compléter ces points.Comme d'autres l'ont mentionné, l'index est stocké sous
.git/index
, et non comme un objet d'arborescence standard, et son format est binaire et documenté à l' adresse : https://github.com/git/git/blob/master/Documentation/technical/index-format. SMSLes principales structures qui définissent l'index se trouvent dans cache.h , car l'index est un cache pour créer des validations.
Installer
Lorsque nous démarrons un référentiel de test avec:
Le
.git
répertoire ressemble à:Et si nous obtenons le contenu du seul objet:
Nous obtenons
a
. Cela indique que:index
points vers le contenu du fichier, depuis lagit add b
création d'un objet blobanalyse HD
Regardons maintenant l'index lui-même:
Donne:
Ensuite, nous conclurons:
Vient d'abord l'en-tête, défini à: struct cache_header :
44 49 52 43
:DIRC
. TODO: pourquoi est-ce nécessaire?00 00 00 02
: format version: 2. Le format de l'index a évolué avec le temps. Il existe actuellement une version jusqu'à 4. Le format de l'index ne devrait pas être un problème lors de la collaboration entre différents ordinateurs sur GitHub car les dépôts nus ne stockent pas l'index: il est généré au moment du clonage.00 00 00 01
: Nombre de fichiers sur l'index: un seul,b
.Ensuite commence une liste d'entrées d'index, définies par struct cache_entry. Ici, nous n'en avons qu'une. Il contient:
un tas de métadonnées de fichier: 8 octets
ctime
, 8 octetsmtime
, puis 4 octets: périphérique, inode, mode, UID et GID.Notez comment:
ctime
etmtime
sont les mêmes (54 09 76 e6 1d 81 6f c6
) que prévu puisque nous n'avons pas modifié le fichierLes premiers octets sont des secondes depuis EPOCH en hexadécimal:
Donne:
C'est alors que j'ai fait cet exemple.
Les 4 octets suivants sont des nanosecondes.
UID et GID sont
00 00 03 e8
, 1000 en hexadécimal: une valeur commune pour les configurations mono-utilisateur.Toutes ces métadonnées, dont la plupart ne sont pas présentes dans les objets d'arborescence, permettent à Git de vérifier si un fichier a changé rapidement sans comparer le contenu entier.
en début de ligne
30
::00 00 00 02
taille du fichier: 2 octets (a
et\n
deecho
)78 98 19 22 ... c1 99 4e 85
: 20 octets SHA-1 sur le contenu précédent de l'entrée. Notez que selon mes expériences avec l'indicateur supposer valide , les indicateurs qui le suivent ne sont pas pris en compte dans ce SHA-1.Indicateurs 2 octets:
00 01
1 bit: suppose un drapeau valide. Mes investigations indiquent que ce drapeau mal nommé est l'endroit où
git update-index --assume-unchanged
stocke son état: https://stackoverflow.com/a/28657085/895245Drapeau étendu 1 bit. Détermine si les indicateurs étendus sont présents ou non. Doit être
0
sur la version 2 qui n'a pas d'indicateur étendu.Drapeau d'étape 2 bits utilisé pendant la fusion. Les étapes sont documentées dans
man git-merge
:0
: fichier normal, pas dans un conflit de fusion1
: base2
: les notres3
: les leursLors d'un conflit de fusion, toutes les étapes de 1 à 3 sont stockées dans l'index pour permettre des opérations telles que
git checkout --ours
.Si vous
git add
, alors une étape 0 est ajoutée à l'index du chemin, et Git saura que le conflit a été marqué comme résolu. TODO: vérifiez ceci.Longueur de 12 bits du chemin qui suivra
0 01
:: 1 octet seulement depuis le cheminb
Indicateurs étendus de 2 octets. Uniquement significatif si le "drapeau étendu" a été défini sur les indicateurs de base. FAIRE.
62
(ASCIIb
): chemin de longueur variable. Longueur déterminée dans les drapeaux précédents, ici seulement 1 octet,b
.Vient ensuite un
00
: 1 à 8 octets de remplissage nul de sorte que le chemin se termine par un zéro et que l'index se termine par un multiple de 8 octets. Cela se produit uniquement avant la version 4 de l'index.Aucune extension n'a été utilisée. Git le sait car il n'y aurait pas assez d'espace libre dans le fichier pour la somme de contrôle.
Enfin, il y a une somme de contrôle de 20 octets
ee 33 c0 3a .. 09 ab 49 94
sur le contenu de l'index.la source
git add
, par votreTODO
: vous avez raison. Si vous avez des entrées d'index de haut niveau (un conflit) à un chemin donné, lorsque vousgit add
ce chemin, toutes les entrées d'index de haut niveau seront supprimées et la copie du répertoire de travail sera ajoutée à l'étape0
. (Résoudre le conflit).L'index Git est une zone intermédiaire entre votre répertoire de travail et votre référentiel. Vous pouvez utiliser l'index pour créer un ensemble de modifications que vous souhaitez valider ensemble. Lorsque vous créez une validation, ce qui est validé est ce qui se trouve actuellement dans cet index, pas ce qui se trouve dans votre répertoire de travail.
Pour voir ce qu'il y a à l'intérieur de l'index, exécutez la commande:
Lorsque vous exécutez git status, vous pouvez voir quels fichiers sont mis en scène (actuellement dans votre index), qui sont modifiés mais pas encore mis en scène, et lesquels sont complètement non suivis.
Vous pouvez lire ceci . Une recherche Google génère de nombreux liens, qui devraient être assez autonomes.
la source
git status
ne répertorie pas tous les fichiers de l'index. Il répertorie uniquement les fichiers qui diffèrent entre l'index et le répertoire de travail. Pour voir tous les fichiers dans l'index, vous devez utilisergit ls-files
.git status
fait dans la liste des fichiers d'index fait, indépendamment du fait qu'ils diffèrent entre l' indice et workdir.git status
répertorie les fichiers qui se trouvent dans l'index, oui, mais ne répertorie pas tous les fichiers de l'index. Expliquer comment fonctionnegit status
réellement serait une réponse bénéfique à une question, mais probablement pas à celle-ci.git status
affiche l'état de l'arbre de travail (différence entre l'arbre de travail et l'index). Il ne montre pas réellement l'index. git-scm.com/docs/git-statusVoici ce dont vous aviez exactement besoin, utilisez cette commande.
$ binwalk index
la source
L'index Git est un fichier binaire (généralement conservé
.git/index
) contenant une liste triée de noms de chemins, chacun avec des autorisations et le SHA1 d'un objet blob;git ls-files
peut vous montrer le contenu de l'index. Veuillez noter que les motsindex
,stage
etcache
sont la même chose dans Git: ils sont utilisés de manière interchangeable.L'index Git, ou cache Git, a 3 propriétés importantes:
Source :
la source