2011-06-10 41 views
2

我發現git的內部管道真的很迷人。至少在概念層面上,它很簡單,非常優雅。在話題很多資料都說明如何編寫一個帶紅寶石的幾行BLOB對象,如在Pro Git Blob對象(Git MagicGit 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對象一樣容易地生成樹和提交對象。有人可以爲此提供短代碼片段嗎?

+0

這裏有一個類似的問題,但它再次主要是對斑點對象:http://stackoverflow.com/questions/5290444/why-does-git-hash-object-return-a-different-hash-than-openssl -sha1 – 2011-06-10 11:23:12

回答

4

你看了grit是爲了開發github嗎?

有人可能已經在紅寶石中實現了這一點,並且最有可能的是在那裏。

希望有所幫助。

+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 2011-06-10 09:25:18

+0

當我試圖解決這個問題時,我發現了勇氣。問題是,我不是在尋找一個ruby git客戶端,而是想知道git如何在內部工作。 Ruby似乎是傳達這類信息的一種相當好的語言,即使我的ruby技能接近不存在的情況。 – 2011-06-10 09:59:53

+1

@sehe,感謝您的有趣鏈接! @凱我明白了,對不起,如果這沒有幫助。不用僅僅使用一個庫,而是看他們的代碼(也看看sehe的建議)肯定會回答你所有的問題+更多地學習ruby ......這就是我可能會這麼做的方式......對於更復雜的東西所以記錄下來,我也會直接看看git代碼:'git clone git:// git.kernel.org/pub/scm/git/git.git' – 2011-06-10 10:07:05