如何查找Github文件的SHA blob

40
4个回答

37

更新文件的文档指定您需要提供要替换的文件的SHA。最简单的方法是也查询GitHub。例如:

> curl https://api.github.com/repos/testacc01/testrepo01/contents/test.txt
{
  "name": "test.txt",
  "path": "test.txt",
  "sha": "4f8a0fd8ab3537b85a64dcffa1487f4196164d78",
  "size": 13,
所以,您可以在JSON响应的“sha”字段中看到SHA是什么。 在您制定包含新版本的请求时,请使用该值。 成功更新文件后,文件将具有一个新的SHA,您需要在再次更新之前请求该新的SHA。(除非您的下一次更新在另一个分支上)

1
谢谢,这对我有用。我忘记了在文件更新后SHA将自动更新。 - Kiddo
1
我在 GitHub 的 v3 API 文档中没有找到他们用于生成文件哈希值的具体 SHA 哈希函数 - SHA1、SHA256 等(以便我可以验证文件内容)。我相信 Git 使用 SHA-1 用于提交哈希,但我不清楚 GitHub 正在使用哪个哈希函数对文件内容进行哈希。我已向他们提出了请求此信息的工单。 - Taylor D. Edmiston
@TaylorEdmiston 你好,你从Github那里得到任何回应了吗? - Maorg
嗯,我不确定。我在我的电子邮件中搜索了它,但是没有找到GitHub的回复。 - Taylor D. Edmiston
2
关于使用的SHA哈希函数:https://developer.github.com/v3/git/blobs/#get-a-blob指出“文件的SHA-1哈希值被计算并存储在blob对象中”。因此,它是SHA-1。 - jfix
使用获取存储库内容以获得文件SHA的方法,如果文件大于1MB,则无法正常工作:https://developer.github.com/v3/repos/contents/#get-repository-content - Chuck Doucette

11

如果您不想触发 API,可以自行生成 SHA。Git 通过将形式为 blob {content.length} {null byte} 的头和文件内容连接起来来生成 SHA。例如:

content = "what is up, doc?"
header = "blob #{content.bytesize}\0"
combined = header + content # will be "blob 16\u0000what is up, doc?"
sha1 = Digest::SHA1.hexdigest(combined)

来源: https://git-scm.com/book/zh/v2/Git-Internals-Git-Objects

以下是需要翻译的内容:

可能有用的是提一下这是Ruby代码。 :) - D Malan

7
如果您使用GraphQL API v4,您可以使用以下内容查找特定文件的sha:
{
  repository(owner: "testacc01", name: "testrepo01") {
    object(expression: "master:test.txt") {
      ... on Blob {
        oid
      }
    }
  }
}

在浏览器中尝试


4

使用Octokit Rest API

import { Octokit } from "@octokit/rest";
    
const { data: { sha } } = await octokit.request('GET /repos/{owner}/{repo}/contents/{file_path}', {
  owner: "owner-name",
  repo: "repo-name",
  file_path: "file-path-with-extension-from-root"
});

1
这将获取整个文件内容。 - ABDELLATIF ANAFLOUS
我找不到只获取文件SHA的方法,但至少这个方法有效,尽管我不得不将它放在try catch中,因为如果找不到文件,它会抛出一个错误。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接