如何从 Github API 获取最新版本的提交哈希

Posted

技术标签:

【中文标题】如何从 Github API 获取最新版本的提交哈希【英文标题】:How can I get the commit hash of the latest release from Github API 【发布时间】:2021-04-11 01:55:45 【问题描述】:

我想在 repo 中从 Github 获取最新标记版本的 git commit 哈希。是否可以通过 GitHub API 获取?

这将很有帮助,如果不仅适用于下面的用例,我需要使用 Git Commit 哈希(而不是标签)来下载 vscode 服务器代码。

这是我尝试获取 microsoft/vscode 最新提交哈希的代码: https://github.com/b01/faith-works-t-shirts/blob/main/.docker/download-vs-code-server.sh

【问题讨论】:

我看到这个问题已被标记,也投票结束。但是我认为应该提供一个理由。比如跑题,太具体,什么的。我们是否只是在不离开 cmets 的情况下关闭事物,为什么现在?没有适当的反馈,我无法学习或改进。 【参考方案1】:

使用 Github Rest v3

您需要使用get latest release API 获取标签:

GET /repos/owner/repo/releases/latest

示例:https://api.github.com/repos/mui-org/material-ui/releases/latest

然后使用get tag API获取标签sha:

GET /repos/owner/repo/git/ref/tags/tag_name

示例:https://api.github.com/repos/mui-org/material-ui/git/ref/tags/v4.11.3

如果typecommit,则标签sha指向一个commit,否则需要调用:

GET /repos/owner/repo/git/tags/tag_sha

并获取object.sha https://api.github.com/repos/$repo/git/tags/$tag_sha 使用curl 和jq 的示例:

repo=microsoft/vscode

tag=$(curl -s "https://api.github.com/repos/$repo/releases/latest" | jq -r '.tag_name')
read type tag_sha < <(echo $(curl -s "https://api.github.com/repos/$repo/git/ref/tags/$tag" | 
     jq -r '.object.type,.object.sha'))

if [ $type == "commit" ]; then
    echo "commit sha: $tag_sha"
else
    sha=$(curl -s "https://api.github.com/repos/$repo/git/tags/$tag_sha" | jq '.object.sha')
    echo "commit sha: $sha"
fi

GraphQL v4

使用Graphql API v4,更直接:


  repository(owner: "microsoft", name: "vscode") 
    latestRelease
      tagCommit 
        oid
      
    
  

使用curl 和jq 的示例:

repo=material-ui
owner=mui-org
token=YOUR_TOKEN

curl -s -H "Authorization: token $token" \
     -H  "Content-Type:application/json" \
     -d ' 
          "query": "repository(owner:\"'"$owner"'\", name:\"'"$repo"'\")latestReleasetagCommit oid"
      ' https://api.github.com/graphql | jq -r '.data.repository.latestRelease.tagCommit.oid'

【讨论】:

这些工作,但在某些情况下,您从 API 返回的 sha 可能与您在 UI 或 GraphQL API 中看到的不匹配,例如当我在 04/11/2021T06 尝试这些时: 52 AM api.github.com/repos/microsoft/vscode/releases/latest api.github.com/repos/microsoft/vscode/git/ref/tags/1.55.1 来自 API:825765b57869b765fc7c15cd3ff8e7f8350ac1a0 从 GitHub UI 我看到:08a217c4d27a02a5bcde898fd7981bda5b49391b 来自 GraphQL API;我回复08a217c4d27a02a5bcde898fd7981bda5b49391b 但我想这是另一个问题。 @b01 请参阅与打包参考相关的this。确实,当我克隆visualcode repo和git show-ref -d 1.55.1时,它给出了825765b57869b765fc7c15cd3ff8e7f8350ac1a0 refs/tags/1.55.108a217c4d27a02a5bcde898fd7981bda5b49391b refs/tags/1.55.1^ 我知道标签类型的差异,但从未花时间了解差异是什么。在这种情况下非常重要。 在 Alpine Docker 容器中,对于 GraphQL 版本,我必须将 read 命令替换为:tag_data=$(curl -s "https://api.github.com/repos/$1/git/ref/tags/$tag" | jq -r '.object.type,.object.sha') sha_type=$tag_data%$'\n'* sha=$tag_data##*$'\n'

以上是关于如何从 Github API 获取最新版本的提交哈希的主要内容,如果未能解决你的问题,请参考以下文章

pygithub如何获取特定分支的最新提交

获取 github 仓库最新版本号和版本号列表的 API

获取 github 仓库最新版本号和版本号列表的 API

从分支获取最新 Git 提交哈希的命令

如何从 github 获取 gem 的特定“提交”?

sh [Shell - 从GitHub上的存储库获取最新版本号]从GitHub上的存储库获取最新版本号,不适用不规范发布#github #shell