【问题标题】:How do I get the "sha" parameter from GitHub API without downloading the whole file?如何在不下载整个文件的情况下从 GitHub API 获取“sha”参数?
【发布时间】:2014-10-05 14:35:11
【问题描述】:

我一直在尝试使用 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”字段而不下载整个文件?

【问题讨论】:

标签: git github


【解决方案1】:

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

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

  • 利用 GitHub Trees API 检索与 Lib/MoQ 父目录匹配的 Tree 的内容
  • 从返回的 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
}

【讨论】:

  • 这可以用来获取 GitHub 私有仓库中文件/目录的 sha 吗?
  • @NickFernandez - 是的,它也适用于私人回购。
  • 注意,这个sha与Git sha无关。
  • 我在尝试这样做时迷路了。如果我的文件位于根目录,我应该有 "trees/master:" 吗?我尝试了所有合理的选择,但仍然“找不到”
【解决方案2】:

https://github.com/api/v3/repos/(organization-name)/(repo-name)/git/trees/(branch-name):(parent-folder-path) 向该端点发送一个 Get 请求,您将获得一个 json 对象数组,其中包含父文件夹内所有文件的 sha,您只需从那里提取您需要的 sha,您可以使用邮递员或 insomnia 进行测试祝你好运

【讨论】:

    【解决方案3】:

    或者做一个:

    GET /repos/:owner/:repo/contents/:path

    在文件的路径上,然后从返回的数据中挑选出sha。

    【讨论】:

    • 你有例子吗?
    • 这个only works如果文件内容小于1MB
    【解决方案4】:

    执行 HEAD 请求而不是 GET。它将 sha 作为 Etag 标头返回。

    【讨论】:

    • 仅当文件小于 1MB 时才会返回 ETag 标头。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多