gitの内部配管がとても魅力的です。少なくとも概念レベルでは、シンプルで非常にエレガントです。トピックに関する多くの情報源は、BLOBオブジェクト(Git MagicとGit 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オブジェクトと同じようにツリーを生成してオブジェクトをコミットすることは可能ですか?誰かがこれに短いコードスニペットを提供できますか?
これは似たような質問ですが、やはりブロブオブジェクトに関するものです:http://stackoverflow.com/questions/5290444/why-does-git-hash-object-return-a-different-hash-than-openssl -sha1 –