2011-06-10 10 views
2

gitの内部配管がとても魅力的です。少なくとも概念レベルでは、シンプルで非常にエレガントです。トピックに関する多くの情報源は、BLOBオブジェクト(Git MagicGit Internals)、およびPro Gitのようにルビーの数行でブロブオブジェクトを作成する方法を説明しさえ短いRubyスクリプトの詳細な説明がありますGit Treeと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 }   

通常と結論します他のストレージオブジェクト(ツリー、コミット、およびタグ)はまったく同じですが、ヘッダーが異なります。ただし、スクリプトのヘッダとテキストの内容を変更すると、破損したツリーやコミットエントリ、および/または一致しないチェックサムが導出されるだけなので、内部形式には多少の違いがあるようです。他のオブジェクトは、ブロブと比較して異なる方法で格納されていますか?

cat-fileと他のオブジェクトからのかなり印字された出力は、実際のストレージファイルの実装と非常によく似ていないようです。 Git MagicにAccoring

は、ツリーオブジェクトフォーマットは

"tree" SP "<content length>" NUL "<permissions> <filename>" NUL <checksum> 

ですが、私は私のちっぽけなルビーのスキルで、このための正しいチェックサムを生成することができませんでしだ。 BLOBオブジェクトと同じようにツリーを生成してオブジェクトをコミットすることは可能ですか?誰かがこれに短いコードスニペットを提供できますか?

+0

これは似たような質問ですが、やはりブロブオブジェクトに関するものです:http://stackoverflow.com/questions/5290444/why-does-git-hash-object-return-a-different-hash-than-openssl -sha1 –

答えて

4

githubに電源を供給するために開発されたgritを見ましたか?

誰かが既にこれをRubyで実装している可能性があります。

希望に役立ちます。

+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

これを理解しようとすると、グリットが見つかりました。問題は、私はルビーのgitクライアントを探しているのではなく、gitが内部的にどのように動作するかを知りたいと思っています。 Rubyは、たとえ私のルビーのスキルが存在しない場合でも、この種の情報を伝えるのにかなり良い言語のようです。 –

+1

@sehe、興味深いリンクをありがとう! @カイ私は理解する、それはあまり助けなかった場合はごめんなさい。ライブラリを使うだけでなく、コードを見ても(確かにseheの勧告を見てください)、確かにすべての質問に答えることができます+ルビーをもう少し学ぶ...それはおそらく私がやる方法です...もっと複雑なものではないこのように文書化されていれば、私はgitコードを直接見ていきます> 'git clone git:// git.kernel.org/pub/scm/git/git.git' –

関連する問題