GitHub上的API - 什么是让每个文件相关联的最后提交信息的最佳方式?(On GitHub

2019-08-21 04:35发布

到目前为止,据我所知,消息与关联提交。 但是,当你看到在GitHub上回购其有益每个文件列出的消息,对于何时最后改变。

我想复制在回购我有一个Web视图。 纵观GitHub的API,它看起来我得到这些信息的唯一途径是从最近期的分配承诺在您的本地缓存中的信息,将文件下载所有的 (可分页)的提交,工作,打算进一步和进一步回,直到你为每个文件的消息,可能在第一个承诺,如果任何文件尚未从最初的改变提交

问题是,这是正确的方式做到这一点? 是不是要杀连5000 /小时的配额?

Answer 1:

好吧,搞清楚你需要的是之后的最新提交信息中的每个文件,这里是你可以做什么。

首先,让你的库文件的列表。 要做到这一点,您需要:

1) 获取引用对象要列出文件的分支:

GET https://api.github.com/repos/:owner/:repo/git/refs/heads/:branch

你可能想的主分支,所以这是你会做的请求的例子:

https://api.github.com/repos/izuzak/pmrpc/git/refs/heads/master

你会得到的回应将是这样的:

{
  "ref": "refs/heads/master",
  "url": "https://api.github.com/repos/izuzak/pmrpc/git/refs/heads/master",
  "object": {
    "sha": "fd6973f430a3367ad718ff049f1b075843913d6f",
    "type": "commit",
    "url": "https://api.github.com/repos/izuzak/pmrpc/git/commits/fd6973f430a3367ad718ff049f1b075843913d6f"
  }
}

2) 获取commit对象 ,该基准点到,使用object.url您在前面步骤中接收的响应的属性:

GET https://api.github.com/repos/izuzak/pmrpc/git/commits/fd6973f430a3367ad718ff049f1b075843913d6f

你会得到的回应将是这样的:

{
  "sha": "fd6973f430a3367ad718ff049f1b075843913d6f",
  "url": "https://api.github.com/repos/izuzak/pmrpc/git/commits/fd6973f430a3367ad718ff049f1b075843913d6f",
  "html_url": "https://github.com/izuzak/pmrpc/commits/fd6973f430a3367ad718ff049f1b075843913d6f",
  "author": {
    "name": "Ivan Zuzak",
    "email": "izuzak@gmail.com",
    "date": "2013-04-09T08:55:45Z"
  },
  "committer": {
    "name": "Ivan Zuzak",
    "email": "izuzak@gmail.com",
    "date": "2013-04-09T08:55:45Z"
  },
  "tree": {
    "sha": "f5f5de80f67dd794ffbd4abb855fb7d1a573660e",
    "url": "https://api.github.com/repos/izuzak/pmrpc/git/trees/f5f5de80f67dd794ffbd4abb855fb7d1a573660e"
  },
  "message": "fix typos",
  "parents": [
    {
      "sha": "d3617ae56dda793131e743b2ff394984bbab6ca3",
      "url": "https://api.github.com/repos/izuzak/pmrpc/git/commits/d3617ae56dda793131e743b2ff394984bbab6ca3",
      "html_url": "https://github.com/izuzak/pmrpc/commits/d3617ae56dda793131e743b2ff394984bbab6ca3"
    }
  ]
}

3) 取树对象在先前步骤中取出的commit对象的。 您将通过遵循做到这一点tree.url在上一步的响应提供的链接:

GET https://api.github.com/repos/izuzak/pmrpc/git/trees/f5f5de80f67dd794ffbd4abb855fb7d1a573660e

响应将是这样的:

{
  "sha": "f5f5de80f67dd794ffbd4abb855fb7d1a573660e",
  "url": "https://api.github.com/repos/izuzak/pmrpc/git/trees/f5f5de80f67dd794ffbd4abb855fb7d1a573660e",
  "tree": [
    {
      "mode": "100644",
      "type": "blob",
      "sha": "726f21a4adec8c24c2fab6cf5b455d094a8b21bf",
      "path": "LICENSE.markdown",
      "size": 568,
      "url": "https://api.github.com/repos/izuzak/pmrpc/git/blobs/726f21a4adec8c24c2fab6cf5b455d094a8b21bf"
    },
    {
      "mode": "100644",
      "type": "blob",
      "sha": "eb94760b81441b34a73d1b085d9f153ae48b0e63",
      "path": "README.markdown",
      "size": 5772,
      "url": "https://api.github.com/repos/izuzak/pmrpc/git/blobs/eb94760b81441b34a73d1b085d9f153ae48b0e63"
    },
    {
      "mode": "040000",
      "type": "tree",
      "sha": "2e72b217b8644ce6874cda03387a7ab2d8eee55e",
      "path": "examples",
      "url": "https://api.github.com/repos/izuzak/pmrpc/git/trees/2e72b217b8644ce6874cda03387a7ab2d8eee55e"
    },
    {
      "mode": "100644",
      "type": "blob",
      "sha": "64b0dbe4981759c0f9640c8e882c97c7324fc798",
      "path": "pmrpc.js",
      "size": 24546,
      "url": "https://api.github.com/repos/izuzak/pmrpc/git/blobs/64b0dbe4981759c0f9640c8e882c97c7324fc798"
    }
  ]
}

这些存储库中的所有文件和文件夹。 但是请注意,对于文件夹,您将需要递归获取文件夹树对象,以获取该文件夹中的文件列表。 在上面的反应中, examples是一种可以通过type属性的值树看到的文件夹。 所以,你将要在提供的文件夹中的网址另一个GET请求:

  GET https://api.github.com/repos/izuzak/pmrpc/git/trees/2e72b217b8644ce6874cda03387a7ab2d8eee55e

另一种方法是只有一个请求,让所有文件列表(所有文件夹中),使用recursive=1的参数,如所描述这里 。 我建议你使用这种方法,因为它仅需要一个HTTP请求。

其次,现在你必须在回购的文件和文件夹列表中,您将得到最后一次提交的是改变每个文件/文件夹。 要做到这一点,提出这一要求

GET https://api.github.com/repos/:user/:repo/commits?path=FILE_OR_FOLDER_PATH

因此,举例来说,这是取用于所述提交的请求examples上面的文件夹中提到:

GET https://api.github.com/repos/izuzak/pmrpc/commits?path=examples

你会得到的回应是commit对象的列表,你应该看看在该列表中的第一个对象(因为你有兴趣在最后一次提交的文件),并获取commit.message属性来获取你需要的信息:

[
  {
    "sha": "3437f015257683a86e3b973b3279754df9ac2b24",
    "commit": {
      "author": { ... },
      "committer": { ... },
      "message": "change mode",
      "tree": { ... },
      "url": "https://api.github.com/repos/izuzak/pmrpc/git/commits/3437f015257683a86e3b973b3279754df9ac2b24",
      "comment_count": 0
    },
    ...
  },
  {
    ...
  }
]

在这种情况下,最新的消息提交已更改的文件夹examples是“改变模式”。

所以,基本上,你需要做3个HTTP请求获取文件的列表,然后1为每个文件和文件夹的HTTP请求。 坏消息是,如果你有大量的文件 - 你会做大量的HTTP请求。 好消息是,你可以缓存响应,这样就不需要提出要求,如果没有改变(见这里获取更多信息)。 此外,你会不会立刻获取所有提交信息,你会为用户浏览文件夹获取它们(就像在GitHub上,你点击文件夹)。 因此,你应该能够保持5000所请求的范围内轻松。

希望这可以帮助! 让我知道如果你找到一个更简单的方法来做到这一点:)。 我不知道那里有一个办法只有1-2个请求,这可能是你所期望的实现这一目标。



Answer 2:

我上市的库比抓住了第一个和阅读它的SHA和它的伟大工程的提交:

https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository

在转到它看起来是这样的:

func GetLatestCommit(owner, repo string, sgc *github.Client) (string, error) {
    commits, res, err := sgc.Repositories.ListCommits(owner, repo, &github.CommitsListOptions{})

    if err != nil {
        log.Printf("err: %s res: %s", err, res)
        return "", err
    }

    log.Printf("last commit: %s", *commits[0].SHA)

    return *commits[0].SHA, nil
}


Answer 3:

在搜索建立永久联系,我发现的检索犯煞最简单的方法之一是实际上解析HTML页面。

优点:

  • 在一个库中的所有文件/文件夹页有它,甚至根
  • 单个HTTP调用
  • 不需要任何身份验证登录
  • 会使用正确的分支(有的不使用主默认)
  • 适用于分支机构太

有一个名为链接Permalink的每个文件页面上。 如果您正在寻找各种方法来识别链路存在类.js-permalink-shortcut ,也是data-hotkey="y"属性,如在获得永久的文件的链接- Github上 。

<a href="/luckydonald/JavaPipBoyServer/blob/a6f4038336ff41463ad527b4ff4fda45642ebc6d/PROTOCOL.md" class="d-none js-permalink-shortcut" data-hotkey="y">Permalink</a>

因此,在这个例子中,啥是a6f4038336ff41463ad527b4ff4fda45642ebc6d

请注意,它总是被渲染,即使你已经上提交。

如果某人喜欢从它建立一个永久链接,链接哈希(例如行引用像#L437-L441 )需要被人工保持(附加)。



文章来源: On GitHub API - what is the best way to get the last commit message associated with each file?