git - 如何在不下载整个文件的情况下从 GitHub API 获取 "sha"参数?

标签 git github

我一直在尝试使用 GitHub API 更新 GitHub 存储库中的文件,但只有该文件的路径。我的计划是首先获取文件内容,如下所述:https://developer.github.com/v3/repos/contents/ ,然后使用“sha”字段来“更新文件”。

它工作正常,就像这里的答案中描述的那样 How to find a Github file 's SHA blob .

但是,使用 GET/repos/:owner/:repo/contents/:path 会下载整个文件,作为返回的 JSON 中的一个字段,这是低效的。所以,我的问题是:有没有办法在不下载整个文件的情况下只获取“sha”字段?

最佳答案

您可以利用 <rev>:<path> <强> extended SHA-1 syntax 从其父树中检索有关 Blob 的一些元数据。

例如,假设您使用 libgit2/libgit2sharp 存储库,并且您想检索文件 Lib/MoQ/Moq.license.txt 的 sha来自 master分支:

  • 利用 GitHub Trees API 检索与 Lib/MoQ 匹配的树的内容父目录
  • 从返回的 Json 负载中检索路径为 Moq.license.txt 的 blob 的 sha
  • 确保对 <rev>:<path> 进行 url 编码段,因为它包含正斜杠

简而言之:

上面的示例链接将返回以下有效负载

{
  "sha": "2f2c87728225f9cbb6e2d8c5997b6031e72ddca4",
  "url": "https://api.github.com/repos/libgit2/libgit2sharp/git/trees/2f2c87728225f9cbb6e2d8c5997b6031e72ddca4",
  "tree": [
    {
      "path": "Moq.dll",
      "mode": "100644",
      "type": "blob",
      "sha": "bdd4235f215541017a9f37b6155f18e309573838",
      "size": 659968,
      "url": "https://api.github.com/repos/libgit2/libgit2sharp/git/blobs/bdd4235f215541017a9f37b6155f18e309573838"
    },
    {
      "path": "Moq.license.txt",
      "mode": "100644",
      "type": "blob",
      "sha": "c9216ccba318292d76fd308f232e7871bbbe77be",
      "size": 1748,
      "url": "https://api.github.com/repos/libgit2/libgit2sharp/git/blobs/c9216ccba318292d76fd308f232e7871bbbe77be"
    },
    {
      "path": "Moq.xml",
      "mode": "100644",
      "type": "blob",
      "sha": "160c1b5165fd967f4c79bc6043f0cc2ec28710d8",
      "size": 314572,
      "url": "https://api.github.com/repos/libgit2/libgit2sharp/git/blobs/160c1b5165fd967f4c79bc6043f0cc2ec28710d8"
    }
  ],
  "truncated": false
}

关于git - 如何在不下载整个文件的情况下从 GitHub API 获取 "sha"参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26203603/

相关文章:

git - 如何使用 Github Actions 将子树从 git repo 推送到 Heroku?

git - 如何使用 bitbucket api 获取所有 pull 请求?

github - 如何在 Github Actions 中访问 SECRETS 的值(value)?

github - Github 的 "Environment"和 "Repository" secret 之间的区别?

git - 使用 Git 克隆时仅选择文件夹的子集

git - 仅使用 git 在当前目录中添加修改过的文件?

python - 如何使用 API 获取 Github 存储库的所有统计信息?

python - Nautilus 3.30 上的 RabbitVCS 未打开记录器和浏览器

github - 如何正确更新我的 Octopress 博客

git - 使用 Github 克隆和本地存储库 : Cloud9 IDE