我发现git的内部管道真的很迷人。至少在概念层面上,它很简单,非常优雅。在话题很多资料都说明如何编写一个带红宝石的几行BLOB对象,如在Pro Git Blob对象(Git Magic和Git Internals)的详细说明,甚至短Ruby脚本:Git树和提交对象的校验和计算
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 }
他们通常会得出这样的结论其他存储对象(树,提交和标记)完全相同,但具有不同的标题。不过,内部格式似乎有一些差异,因为修改脚本标题和文本内容只会导致损坏的树或提交条目和/或不匹配的校验和。与blob相比,其他对象是以不同的方式存储的,并且以何种方式存储?
来自cat-file和其他对象的漂亮打印输出似乎与实际的存储文件实现没有多少相似之处。
Accoring到Git Magic,树对象格式是
"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 – 2011-06-10 11:23:12