Quatre types d'objets
Git stocke tout sous forme d'objets adressés par contenu sous .git/objects. Il y a quatre types : blob (contenu de fichier), tree (listing de répertoire de blobs et subtrees), commit (pointeur d'instantané avec auteur, committer, message et parents), et tag (tag annoté avec signataire et message). Chacun est nommé par le SHA-1 (ou SHA-256) de son contenu.
Inspection
git cat-file -t <sha>
git cat-file -p <sha>
git cat-file -s <sha>
git ls-tree HEAD
git rev-parse HEAD^{tree}
Loose vs packed
Les objets nouvellement créés commencent loose : un fichier compressé zlib par objet sous .git/objects/xx/yyyy.... Le garbage collection combine ensuite plusieurs objets en un packfile.
Hachage
echo "hello" | git hash-object --stdin
git hash-object -w README.md
Les trees encodent les permissions
Une entrée tree est mode + nom + sha. Les modes sont 040000 (répertoire), 100644 (régulier), 100755 (exécutable), 120000 (symlink), 160000 (gitlink/submodule).
Parcourir l'historique
git log --raw
git log --pretty=raw
git rev-list --objects HEAD
Atteignabilité et élagage
git fsck --unreachable
git gc --prune=now
Transition SHA-256
Git moderne supporte les dépôts SHA-256 (git init --object-format=sha256).
Erreurs courantes
Éditer les fichiers sous .git/objects directement. Ne le faites pas. Utilisez les commandes plumbing comme git hash-object et git update-ref.