0

我正在使用 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 术语并不熟悉(oid例如,直到 1 小时前我才听说过)。所以很难在文档中找到我需要的东西。

我是 Ruby、Rugged 和 libgit2 的新手,所以如果我似乎错过了一些明显的东西,我深表歉意。谢谢!

4

2 回答 2

1

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

my_repo.tags.find{|tag| tag.name == "v1.4.2"}.target
于 2019-01-10T03:07:13.907 回答
1

背景

“OID”并不是真正用 Git 的说法:这更像是 Rugged 的​​作者的一个玩意儿。尽管如此,这个术语通俗地代表“对象ID”,其中“ID”代表“标识符”。Git 目前使用 SHA-1 来识别它存储的所有类型的对象(它们是:提交、树和 blob)。因此,大概Repository#lookup需要一个有效对象的 SHA-1(大概格式化为包含该 SHA-1 的十六进制表示的字符串)。

与标识 Git 数据库中各种对象的 SHA-1 名称相反,Git 还具有用于分支和标签的“符号名称”。这些组合起来的东西被称为“refs”,它是“references”的缩写(因为它们,嗯,指的是其他东西——通常是提交,但标签可以指代任何类型的对象)。另请注意,Git 在内部使用术语“头”来指代分支。

更重要的是,Git 实现了一种“迷你语言”,可以使用参考名称、SHA-1 名称和运算符的组合来引用特定的东西。这在 gitrevisions(7)手册页中有记录,它应该是您开始的首选文档。因此,“修订”是可以解析为存储在 Git 数据库中的某种对象的任何内容——通常是提交——使用 Git 的迷你语言。

考虑完整地阅读它,但至少阅读“SPECIFYING REVISIONS”块的第 3 段,<refname> ...从那里开始,您将了解到名为“v1.2.3”的标签的全名实际上是“refs/tags/v1.2.3”,您可以使用该短名称的事实是由于 Git 应用了该手册页中详述的其 ref 解析规则。

解决方案

所以,有了这些知识,快速浏览一下你正在使用的文档 ,至少Repository#rev_parse可以找到你需要的东西——将它传递给“refs/tags/v1.4.2”并完成它。

请注意,将它传递给裸“v1.4.2”也可以,但如果没有这样命名的标签但存在具有该名称的分支,则可能会产生令人惊讶的结果。因此,请考虑您的解决方案。

您发现自己的方式也可以正常工作,但这有点不自然 IMO。

于 2019-01-10T10:04:34.900 回答