Je trouve la plomberie interne de git vraiment fascinante. Au moins sur un plan conceptuel, c'est simple et très élégant. De nombreuses sources sur le sujet ont une description détaillée de l'objet blob (Git Magic et Git Internals), et même de courts scénarios ruby décrivant comment écrire des objets blob avec quelques lignes de rubis comme dans Pro Git:Calcul de la somme de contrôle pour les objets Git Tree et Commit
require 'zlib'
require 'fileutils'
require 'digest/sha1'
content = "StackOverflow"
header = "blob #{content.length}\0"
data = header + content
sha1 = Digest::SHA1.hexdigest(data)
zlib_content = Zlib::Deflate.deflate(data)
path = '.git/objects/' + sha1[0,2] + '/' + sha1[2,38]
FileUtils.mkdir_p(File.dirname(path))
File.open(path, 'w') { |f| f.write zlib_content }
La concluent généralement que les autres objets de stockage (arbres, commits et balises) sont exactement les mêmes, mais avec un en-tête différent. Il semble y avoir une différence dans les formats internes, car la modification de l'en-tête du script et du contenu du texte ne conduit qu'à des entrées d'arbre ou de validation corrompues, et/ou à des sommes de contrôle non correspondantes. Les autres objets sont-ils stockés différemment des blobs et de quelle manière?
La jolie sortie imprimée de cat-file et des autres objets ne semble pas très proche de l'implémentation réelle du fichier de stockage.
accoring à Git Magic, le format d'objet arbre est
"tree" SP "<content length>" NUL "<permissions> <filename>" NUL <checksum>
mais je suis incapable de générer la somme de contrôle correcte pour cela, avec mes compétences en rubis de minables. Est-il possible de générer des objets tree et commit aussi facilement que les objets blob. Quelqu'un pourrait-il fournir des extraits de code court pour cela?
Voici une question similaire, mais il s'agit encore une fois de la plupart des objets blob: http://stackoverflow.com/questions/5290444/why-does-git-hash-object-return-a-different-hash-than-openssl -sha1 –