如何使用 Rugged (libgit2) Ruby gem 查找 tag/ref 的提交?
How to lookup commit by tag/ref using the Rugged (libgit2) Ruby gem?
我正在使用 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 的新手,如果我似乎错过了一些明显的东西,我深表歉意。谢谢!
我在此处找到了一种方法:
my_repo.tags.find{|tag| tag.name == "v1.4.2"}.target
背景
"OID" 并不是 Git 的用语:这是 Rugged 作者的一个巧合。尽管如此,这个术语通俗地代表 "object ID",其中 "ID" 代表 "identifier"。 Git 目前使用 SHA-1 来识别它存储的 所有 类型的对象(它们是:提交、树和 blob)。
因此,大概 Repository#lookup
需要一个有效对象的 SHA-1(大概格式化为包含该 SHA-1 的十六进制表示的字符串)。
与识别 Git 数据库中各种对象的 SHA-1 名称相反,Git 也有 "symbolic names" 用于分支和标签。
这些东西组合起来称为 "refs",它是 "references" 的缩写(因为它们指的是其他东西——通常是提交,但标签可以指代任何类型的对象)。
另请注意,在内部 Git 使用术语 "heads" 来指代分支。
此外,Git 实现了一个 "mini language",它可以是
用于使用 ref 名称、SHA-1 名称和运算符的组合来指代特定内容。这记录在
gitrevisions(7)
手册页,它应该是您的首选文档。因此,"revision" 是可以解析为存储在 Git 数据库中的某种对象的任何东西——通常是提交——使用 Git 的迷你语言。
考虑完整地阅读它,但至少阅读 "SPECIFYING REVISIONS" 块的第 3 段,该段以 <refname> ...
开头 — 从那里,您将了解到全名一个名为 "v1.2.3" 的标签实际上是
"refs/tags/v1.2.3",您可以使用该短名称的事实是由于 Git 应用了该手册页中详述的引用解析规则。
解决方案
所以,有了这些知识,快速浏览一下
通过 the doc you're using
带回至少 Repository#rev_parse
看起来像你需要的 - 传递它 "refs/tags/v1.4.2" 并完成它。
请注意,直接传递它 "v1.4.2" 也可以,但如果没有这样命名的标签但存在具有该名称的分支,则可能会产生令人惊讶的结果。所以仔细考虑你的解决方案。
你发现自己的方式也行,但在我看来有点不自然。
我正在使用 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 的新手,如果我似乎错过了一些明显的东西,我深表歉意。谢谢!
我在此处找到了一种方法:
my_repo.tags.find{|tag| tag.name == "v1.4.2"}.target
背景
"OID" 并不是 Git 的用语:这是 Rugged 作者的一个巧合。尽管如此,这个术语通俗地代表 "object ID",其中 "ID" 代表 "identifier"。 Git 目前使用 SHA-1 来识别它存储的 所有 类型的对象(它们是:提交、树和 blob)。
因此,大概 Repository#lookup
需要一个有效对象的 SHA-1(大概格式化为包含该 SHA-1 的十六进制表示的字符串)。
与识别 Git 数据库中各种对象的 SHA-1 名称相反,Git 也有 "symbolic names" 用于分支和标签。 这些东西组合起来称为 "refs",它是 "references" 的缩写(因为它们指的是其他东西——通常是提交,但标签可以指代任何类型的对象)。 另请注意,在内部 Git 使用术语 "heads" 来指代分支。
此外,Git 实现了一个 "mini language",它可以是
用于使用 ref 名称、SHA-1 名称和运算符的组合来指代特定内容。这记录在
gitrevisions(7)
手册页,它应该是您的首选文档。因此,"revision" 是可以解析为存储在 Git 数据库中的某种对象的任何东西——通常是提交——使用 Git 的迷你语言。
考虑完整地阅读它,但至少阅读 "SPECIFYING REVISIONS" 块的第 3 段,该段以 <refname> ...
开头 — 从那里,您将了解到全名一个名为 "v1.2.3" 的标签实际上是
"refs/tags/v1.2.3",您可以使用该短名称的事实是由于 Git 应用了该手册页中详述的引用解析规则。
解决方案
所以,有了这些知识,快速浏览一下
通过 the doc you're using
带回至少 Repository#rev_parse
看起来像你需要的 - 传递它 "refs/tags/v1.4.2" 并完成它。
请注意,直接传递它 "v1.4.2" 也可以,但如果没有这样命名的标签但存在具有该名称的分支,则可能会产生令人惊讶的结果。所以仔细考虑你的解决方案。
你发现自己的方式也行,但在我看来有点不自然。