不再保留砂砾。检查坚固耐用。
Grit 使您能够通过 Ruby 对 Git 存储库进行面向对象的读/写访问。主要目标是稳定性和性能。为此,与 Git 存储库的一些交互是通过调用系统的git
命令来完成的,而其他交互则是通过核心 Git 功能的纯 Ruby 重新实现来完成的。然而,这种选择对最终用户来说是透明的,您不需要知道正在使用哪种方法。
该软件是为 GitHub 提供支持而开发的,应该被视为生产就绪。提供了广泛的测试套件来验证其正确性。
Grit 由 Tom Preston-Werner、Scott Chacon、Chris Wanstrath 和 PJ Hyett 维护。
从 Grit 2.3 开始,本文档是准确的。
最简单的安装是通过 RubyGems:
$ gem install grit
Grit 的 Git 存储库可在 GitHub 上找到,可以在以下位置浏览:
http://github.com/mojombo/grit
并克隆:
git clone git://github.com/mojombo/grit.git
您将需要这些宝石才能通过测试:
如果您想破解 Grit,请按照以下说明进行操作。要获取所有依赖项,请先安装 gem。
rake
确保一切仍然通过Grit 使您能够访问 Git 存储库的对象模型。创建Repo
对象后,您可以遍历它以查找父提交、树、blob 等。
第一步是创建一个Grit::Repo
对象来表示您的存储库。在本文档中,我包含了Grit
模块以减少打字。
require 'grit'
repo = Grit::Repo.new("/Users/tom/dev/grit")
在上面的示例中,目录/Users/tom/dev/grit
是我的工作目录,包含.git
目录。您还可以使用裸存储库初始化 Grit。
repo = Repo.new("/var/git/grit.git")
从Repo
对象中,您可以获取作为Commit
对象数组的提交列表。
repo.commits
# => [#<Grit::Commit "e80bbd2ce67651aa18e57fb0b43618ad4baf7750">,
#<Grit::Commit "91169e1f5fa4de2eaea3f176461f5dc784796769">,
#<Grit::Commit "038af8c329ef7c1bae4568b98bd5c58510465493">,
#<Grit::Commit "40d3057d09a7a4d61059bca9dca5ae698de58cbe">,
#<Grit::Commit "4ea50f4754937bf19461af58ce3b3d24c77311d9">]
不带参数调用时, Repo#commits
返回主分支可访问的最多 10 个提交的列表(从最新提交开始)。您可以要求从不同的分支、提交、标签等开始提交。
repo.commits('mybranch')
repo.commits('40d3057d09a7a4d61059bca9dca5ae698de58cbe')
repo.commits('v0.1')
您可以指定要返回的最大提交数。
repo.commits('master', 100)
如果需要分页,可以指定要跳过的提交数量。
repo.commits('master', 10, 20)
上面将从提交列表中返回 21-30 的提交。
Commit
对象包含有关该提交的信息。
head = repo.commits.first
head.id
# => "e80bbd2ce67651aa18e57fb0b43618ad4baf7750"
head.parents
# => [#<Grit::Commit "91169e1f5fa4de2eaea3f176461f5dc784796769">]
head.tree
# => #<Grit::Tree "3536eb9abac69c3e4db583ad38f3d30f8db4771f">
head.author
# => #<Grit::Actor "Tom Preston-Werner <[email protected]>">
head.authored_date
# => Wed Oct 24 22:02:31 -0700 2007
head.committer
# => #<Grit::Actor "Tom Preston-Werner <[email protected]>">
head.committed_date
# => Wed Oct 24 22:02:31 -0700 2007
head.message
# => "add Actor inspect"
您可以通过链接调用#parents
来遍历提交的祖先。
repo.commits.first.parents[0].parents[0].parents[0]
上面对应于 Git 术语中的master^^^或master~3 。
树记录指向目录内容的指针。假设您想要主分支上最新提交的根树。
tree = repo.commits.first.tree
# => #<Grit::Tree "3536eb9abac69c3e4db583ad38f3d30f8db4771f">
tree.id
# => "3536eb9abac69c3e4db583ad38f3d30f8db4771f"
一旦你拥有了一棵树,你就可以获得其中的内容。
contents = tree.contents
# => [#<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">,
#<Grit::Blob "81d2c27608b352814cbe979a6acd678d30219678">,
#<Grit::Tree "c3d07b0083f01a6e1ac969a0f32b8d06f20c62e5">,
#<Grit::Tree "4d00fe177a8407dbbc64a24dbfc564762c0922d8">]
该树包含两个Blob
对象和两个Tree
对象。树是子目录,blob 是文件。根以下的树具有附加属性。
contents.last.name
# => "lib"
contents.last.mode
# => "040000"
有一种方便的方法可以让您从树中获取命名的子对象。
tree / "lib"
# => #<Grit::Tree "e74893a3d8a25cbb1367cf241cc741bfd503c4b2">
如果您知道树的名称,也可以直接从存储库获取树。
repo.tree
# => #<Grit::Tree "master">
repo.tree("91169e1f5fa4de2eaea3f176461f5dc784796769")
# => #<Grit::Tree "91169e1f5fa4de2eaea3f176461f5dc784796769">
一个 blob 代表一个文件。树木通常含有斑点。
blob = tree.contents.first
# => #<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">
Blob 具有某些属性。
blob.id
# => "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666"
blob.name
# => "README.txt"
blob.mode
# => "100644"
blob.size
# => 7726
您可以获取字符串形式的 blob 数据。
blob.data
# => "Grit is a library to ..."
如果您知道 Blob 的名称,也可以直接从存储库获取该 Blob。
repo.blob("4ebc8aea50e0a67e000ba29a30809d0a7b9b2666")
# => #<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">
还有更多可用的 API 方法,此处未记录。更多功能请参考代码。
版权所有 (c) 2010 汤姆·普雷斯顿-沃纳。有关详细信息,请参阅许可证。