如何使用Rugged(libgit2)Ruby gem通过标记/引用查找提交?

时间:2019-01-10 01:45:26

标签: ruby git libgit2 rugged

我正在使用Rugged,这是Ruby的libgit2绑定。我已经看到您可以调用Repository#lookup方法来在git存储库中的给定SHA哈希处获取对象。

问题是,我不知道我要查找的提交的哈希值。我确实知道标签ID(例如v1.4.2)。我想要类似的东西:

# not real API!
my_repo.lookup('v1.4.2')

或者,如果这是我能做到的最好的话,这样的事情就可以了:

# not real API!
sha = my_repo.get_sha_from_tag('v1.4.2')
my_repo.lookup(sha)

麻烦的是,尽管我正在阅读文档,但是我不熟悉许多使用的底层Git术语(直到1小时前我才听说oid,因为例)。因此,很难在文档中找到我需要的东西。

我是Ruby,Rugged和libgit2的新手,如果我似乎错过了一些明显的事情,就深表歉意。谢谢!

2 个答案:

答案 0 :(得分:1)

在这里,我找到了一种方法

my_repo.tags.find{|tag| tag.name == "v1.4.2"}.target

答案 1 :(得分:1)

背景

“ GID”并不是真正意义上的“ OID”:这是Rugged作者的一种悖论。尽管如此,该术语通俗地表示“对象ID”,其中“ ID”表示“标识符”。 Git目前使用SHA-1来标识它存储的 all 对象的类型(提交,树和Blob)。 因此,大概Repository#lookup期望使用有效对象的SHA-1(大概格式化为包含该SHA-1的十六进制表示形式的字符串)。

与在Git数据库中标识各种对象的SHA-1名称相反,Git还为分支和标记具有“符号名称”。 那些组合在一起的东西称为“引用”,是“引用”的缩写(因为它们很好地引用了其他内容-通常是提交,但是标记根本可以引用任何种类的对象)。 还要注意,Git在内部使用术语“ heads”来指代分支。

此外,Git实现了一种“迷你语言”,可以 用于通过引用名称,SHA-1名称和运算符的组合来引用特定内容。这记录在 gitrevisions(7)手册页,它应该是您入门的文档。因此,“修订”是指可以使用该Git的最小语言解析为存储在Git数据库中的某种对象(通常是提交)的任何事物。

请仔细阅读全文,但至少要阅读“ SPECIFYING REVISIONS”块的第3段,该段以<refname> ...开头—从那里,您将了解到名为的标记的全名,例如,“ v1.2.3”实际上是 “ refs / tags / v1.2.3”,您之所以可以使用该简称,是因为Git应用了该手册页中详细介绍的ref解析规则。

解决方案

因此,掌握了这些知识后,即可快速浏览 通过the doc you're using 至少恢复看起来像您所需要的Repository#rev_parse -将其传递给“ refs / tags / v1.4.2”并完成该操作。

请注意,将其裸露地传递给“ v1.4.2”也可以,但是如果没有像这样命名的标签,但是存在一个使用该名称的分支,则结果可能会令人惊讶。因此,请仔细考虑您的解决方案。

您发现自己的方式也可以,但是IMO有点不自然。