Le fichier .git/HEAD contient le chemin de la branche active : cat .git/HEAD
→ ref: refs/heads/main
Le dossier .git/refs/heads contient la référence du dernier commit de chaque
branche. Exemple : cat .git/refs/heads/main → 0950eb5cc1e836da77b5f995ec2cf934c9d7e9a6 ;
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).
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.
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).