2011-06-10 1 views
2

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?

+0

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 –

Répondre

4

Avez-vous jeté un coup d'œil à grit qui a été développé pour alimenter github? Quelqu'un a probablement déjà implémenté cela en ruby, et probablement là.

Espérons que ça aide.

+3

http://programmers.stackexchange.com/questions/62843/best-ruby-git-library, https://github.com/libgit2/rugged, http://git.rubyforge.org/, http: //www.rubyinside.com/git-and-ruby-git-tutorials-articles-and-links-for-rubyists-860.html – sehe

+0

J'ai trouvé du grain en essayant de comprendre cela. La chose est, je ne cherche pas un client Ruby Git, mais plutôt aimerait apprendre comment git fonctionne en interne. Ruby semble être un bon langage pour communiquer ce genre d'informations, même si mes compétences en rubis sont presque inexistantes. –

+1

@sehe, merci pour les liens intéressants! @Kai je comprends, désolé si cela n'a pas aidé beaucoup. Sans se contenter d'utiliser une bibliothèque, mais en regardant leur code (voir également les recommandations), vous répondrez certainement à toutes vos questions + apprenez un peu plus le rubis ... C'est comme ça que je le ferais ... Pour des choses plus complexes si bien documenté, je donnerais aussi un coup d'oeil au code git directement> 'git clone git: // git.kernel.org/pub/scm/git/git.git' –