Quattro tipi di oggetto
Git memorizza tutto come oggetti content-addressable in .git/objects. Ci sono quattro tipi: blob (contenuti file), tree (elenco directory di blob e sottotree), commit (puntatore snapshot con autore, committer, messaggio, genitori) e tag (tag annotato con firmatario e messaggio).
Ispezione
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
Gli oggetti appena creati partono come loose: un file zlib-compresso per oggetto. La garbage collection successivamente combina molti oggetti in un packfile.
Hashing
echo "hello" | git hash-object --stdin
git hash-object -w README.md
I tree codificano i permessi
Modi: 040000 (directory), 100644 (regolare), 100755 (eseguibile), 120000 (symlink), 160000 (gitlink/submodule).
Camminare nella storia
git log --raw
git log --pretty=raw
git rev-list --objects HEAD
Raggiungibilita e prune
git fsck --unreachable
git gc --prune=now
Transizione SHA-256
Git moderno supporta repository SHA-256 (git init --object-format=sha256).
Errori comuni
Modificare file sotto .git/objects direttamente. Non farlo. Usare comandi plumbing come git hash-object e git update-ref.