2011-06-10 118 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