我發現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