Les références

Le fichier .git/HEAD contient le chemin de la branche active : cat .git/HEADref: refs/heads/main

Le dossier .git/refs/heads contient la référence du dernier commit de chaque branche. Exemple : cat .git/refs/heads/main0950eb5cc1e836da77b5f995ec2cf934c9d7e9a6 ; C’est un condensé qui fait référence à un objet de type commit compressé avec zlib et enregistré dans le fichier .git/objects/09/50eb5cc1e836da77b5f995ec2cf934c9d7e9a6 (les deux premiers caractères du condensé indiquent le sous-dossier).

Les objets

Pour afficher le contenu d’un objet, il faut le décompresser ; exemple : zlib-flate -uncompress < .git/objects/09/50eb5cc1e836da77b5f995ec2cf934c9d7e9a6

commit 239tree d8b4a28b7f21ae35619cf788fda6c43c234abf87
parent 0c0ed5e9d2f2c096af50cb92bcbfc2d571dede06
author Prénom NOM <adresse@courrier.ext> 1763511540 -1000
committer Prénom NOM <courriel@domaine.ext> 1763511540 -1000

Description du commit.

Dans cet exemple, l’objet est de type commit, sa taille est de 239 octets (cf contenu à partir de tree) et il fait référence à l’arborescence d8b4a28b7f21ae35619cf788fda6c43c234abf87. Le condensé du commit qui le précède (parent) est 0c0ed5e9d2f2c096af50cb92bcbfc2d571dede06.

Pour décoder un objet de type tree, il faut en afficher le contenu hexadécimal : zlib-flate -uncompress < .git/objects/d8/b4a28b7f21ae35619cf788fda6c43c234abf87 | hexdump -C :

00000000  74 72 65 65 20 37 32 00  31 30 30 36 34 34 20 52  |tree 72.100644 R|
00000010  45 41 44 4d 45 2e 6d 64  00 68 8a 21 bf 76 a2 f1  |EADME.md.h.!.v..|
00000020  cc 90 52 3a 50 29 c7 f6  be fb b2 b5 ee 31 30 30  |..R:P).......100|
00000030  36 34 34 20 70 72 6f 67  2e 70 79 00 bb 60 ca 4d  |644 prog.py..`.M|
00000040  56 df 69 80 1b f5 3b 9d  91 5e f5 29 65 81 0c 96  |V.i...;..^.)e...|
00000050

Dans cet exemple, on voit apparaître deux fichiers : README.md, qui fait référence à l’objet 688a21bf76a2f1cc90523a5029c7f6befbb2b5ee, et prog.py.

Pour connaître l’état du fichier README.md lors du dernier commit, il reste à l’inspecter avec la commande zlib-flate -uncompress < .git/objects/68/8a21bf76a2f1cc90523a5029c7f6befbb2b5ee :

blob 65Description du projet.
Quelque chose de plus précis peut-être.

Il s’agit bien ici d’un fichier (type blob) dont la taille est de 65 octets.

L’index

Lorsqu’un fichier est indexé (cf git add), il est copié (création d’un objet) et référencé dans le fichier .git/index ; cf hexdump -C .git/index :

00000000  44 49 52 43 00 00 00 02  00 00 00 02 69 1d 0c b3  |DIRC........i...|
00000010  30 2f 7a ff 69 1d 0c b3  2f 69 1c ee 00 01 03 04  |0/z.i.../i......|
00000020  00 ba 6a 31 00 00 81 a4  00 00 03 e8 00 00 03 d8  |..j1............|
00000030  00 00 00 41 68 8a 21 bf  76 a2 f1 cc 90 52 3a 50  |...Ah.!.v....R:P|
00000040  29 c7 f6 be fb b2 b5 ee  00 09 52 45 41 44 4d 45  |).........README|
00000050  2e 6d 64 00 69 1d 0e 27  30 1c a0 2a 69 1d 0e 27  |.md.i..'0..*i..'|
00000060  2f df 96 ee 00 01 03 04  00 ba 6a 24 00 00 81 a4  |/.........j$....|
00000070  00 00 03 e8 00 00 03 d8  00 00 00 6a 69 fb 55 5a  |...........ji.UZ|
00000080  b5 95 0b 0d 21 8f 4f 91  f5 e9 50 a2 29 5b 52 1b  |....!.O...P.)[R.|
00000090  00 07 70 72 6f 67 2e 70  79 00 00 00 54 52 45 45  |..prog.py...TREE|
000000a0  00 00 00 06 00 2d 31 20  30 0a 4d ea ea 9c 19 6a  |.....-1 0.M....j|
000000b0  ba 53 c2 5b cb 27 67 66  03 70 5c 3e b2 3b        |.S.[.'gf.p\>.;|
000000be                                                |.|

Dans cet exemple, les fichiers README.md et prog.py font partie des fichiers indexés. La version prise en compte pour README.md est enregistrée dans l’objet 688a21bf76a2f1cc90523a5029c7f6befbb2b5ee (cf offset 0x34), et celle pour prog.py dans l’objet 69fb555ab5950b0d218f4f91f5e950a2295b521b (offset 0x7c).