Github API - 检索用户提交?

Posted

技术标签:

【中文标题】Github API - 检索用户提交?【英文标题】:Github API - retrieve user commits? 【发布时间】:2022-01-12 19:40:54 【问题描述】:

我正在尝试构建一种方法,在该方法中我可以访问 Github 用户名,并发布该用户的所有提交或至少一些提交。

是否调用了 GET user/repo/commit 关联或直接用户/commit?

现在,我认为需要做的是:

    获取与特定名称关联的存储库: api.github.com/users/:name/repos.

    从 feed 中获取 repo 名称。

    将 repo 名称放在数组中,例如:

    api.github.com/repos/:user/:repo1/commits
    api.github.com/repos/:user/:repo2/commits
    api.github.com/repos/:user/:repo3/commits
    从提要中获取 shas 的数量?

【问题讨论】:

使用 graphql 对此有何更新? 【参考方案1】:

也许其他人以后对此感兴趣。

    没有用于检索一个用户的所有提交的 API -> 你必须自己做。

    您描述它的方式很好,但是您错过了从 2 和 4 中您将获得所有提交,而不仅仅是该用户的提交。

Github API 允许你通过作者过滤https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository获取提交列表

我的建议是执行以下操作:

    检索该用户的存储库,解析 JSON 响应并在数组中获取存储库的名称。

    API 链接 - api.github.com/users/:user/repos:user 替换为您想要的用户。

    对于每个存储库,获取该用户创作的提交列表。

    API 链接 - api.github.com/repos/:user/repositoryNameFromArray/commits?author=:user。 将:user 替换为您想要的用户,repositoryNameFromArray 应该来自您的数组。

这里要小心,Github 默认只检索最后 30 次提交。您需要使用分页来获得更大的块,最多 100 个。

你已经完成了。其余的取决于您以及您想如何处理数据。

【讨论】:

【参考方案2】:

您可以使用commit search API 并按作者过滤。

您可以使用author:USERNAMEsearch by author or committer。

这是一个 CURL 请求示例:

curl -u <username>:<personal_token> \
    -X GET \
  'https://api.github.com/search/commits?q=author:<username>&sort=author-date&order=desc&page=1' \
  -H 'Accept: application/vnd.github.cloak-preview'

请参阅this article,了解如何创建个人访问令牌。

记住:搜索 API 仅allows 30 个结果/分钟用于经过身份验证的 API 调用,10 个用于未经身份验证的调用,总共最多 1000 个结果。

此外,使用分页来检查所有结果,否则每页最多 30 个。

【讨论】:

我忘了说完整的API是:GET /search/commits【参考方案3】:

2019 年 5 月更新

您可以通过迭代存储库并使用Contributors API 来获取提交计数。这比在事件 API 中解析提交事件更快、更容易。

基本上查询向/users/&lt;username&gt;/repos发出get请求的用户repos 然后遍历存储库名称,向/repos/&lt;username&gt;/&lt;repo_name&gt;/contributors提出请求

【讨论】:

不属于用户的repos怎么办? IE。对其他存储库的贡献。【参考方案4】:

2018 年 11 月 12 日更新

下面提到的 URL 现在已移动到一个类似于 https://github.com/AurelienLourot?from=2018-10-09 的 URL,但想法保持不变。见github-contribs。


正如其他人所指出的,官方 API 不允许您获取所有用户从一开始就贡献的 GitHub 存储库。

您仍然可以通过查询非官方页面并循环解析它们来获取该信息:

https://github.com/users/AurelienLourot/created_commits?from=2018-05-17&to=2018-05-17 https://github.com/users/AurelienLourot/created_repositories?from=2018-05-17&to=2018-05-17 https://github.com/users/AurelienLourot/created_pull_requests?from=2018-05-17&to=2018-05-17 https://github.com/users/AurelienLourot/created_pull_request_reviews?from=2018-05-17&to=2018-05-17

(免责声明:我是维护者。)

这正是github-contribs 为您所做的:

$ sudo npm install -g @ghuser/github-contribs
$ github-contribs AurelienLourot
✔ Fetched first day at GitHub: 2015-04-04.
⚠ Be patient. The whole process might take up to an hour... Consider using --since and/or --until
✔ Fetched all commits and PRs.
35 repo(s) found:
AurelienLourot/lsankidb
reframejs/reframe
dracula/gitk
...

【讨论】:

【参考方案5】:

遍历用户的存储库是次优的,因为它会错过他们在其他存储库中所做的任何提交。更好的方法是改用Events API。

第一步是get the user's events:

GET /users/:username/events

接下来您需要遍历返回的事件,检查项目where result.type is set to PushEvent。其中每一个都对应于用户的git push,并且来自该推送的提交可用result.payload.commits(按时间倒序)。

您可以通过检查 commit.author.email 是否符合您的预期来过滤这些内容以忽略其他用户所做的任何提交。您还可以访问该对象上的shamessageurl 等属性,并且可以使用distinct 属性消除多次推送中的重复提交。

总体而言,这涉及更多的跑腿工作,但它也让您可以更准确地表示用户实际承诺的内容。

如果有帮助,这里有一些 example code 取自我的网站,它使用上述方法获取用户的最后一次提交(使用 Node.js 和 octokat npm module 实现):

const USER = 'TODO: your GitHub user name'
const EMAIL = 'TODO: your GitHub email address'

const github = require('octokat')( token: 'TODO: your GitHub API token' )

return github.fromUrl(`https://api.github.com/users/$USER/events`)
  .fetch()
  .then(events => 
    let lastCommit

    events.some(event => 
      return event.type === 'PushEvent' && event.payload.commits.reverse().some(commit => 
        if (commit.author.email === EMAIL) 
          lastCommit = 
            repo: event.repo.name,
            sha: commit.sha,
            time: new Date(event.createdAt),
            message: commit.message,
            url: commit.url
          

          return true
        

        return false
      )
    )

    return lastCommit
  )

【讨论】:

很遗憾,这只显示过去 90 天内的事件:docs.github.com/en/rest/reference/activity#list-public-events > 只有过去 90 天内创建的事件才会包含在时间线中。超过 90 天的事件将不包括在内(即使时间轴中的事件总数少于 300 个)。

以上是关于Github API - 检索用户提交?的主要内容,如果未能解决你的问题,请参考以下文章

通过 Github Graphql v4 API 列出所有用户

当存储库在组织下时,Github Api 列表提交状态

WebFlux 扩展未检索第二个请求

通过主邮箱获取 github 用户名

如何检索一个人的所有 GitHub 存储库列表?

我们如何从 API 中检索对讲信使用户/联系人?