Github API - 检索用户提交记录?

20

我正在尝试构建一个方法,通过它我可以访问GitHub用户名,并发布该用户的所有提交或至少一定数量的提交。

是否有调用GET user / repo / commit关联或直接user / commit的方法?

现在,我认为需要以下步骤:

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

  2. 从Feed中获取存储库名称。

  3. 将存储库名称放入数组中,例如:

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

2
有使用GraphQL更新此内容的最新进展吗? - Avinash
5个回答

23

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

第一步是获取用户的事件

GET /users/:username/events

接下来,您需要遍历返回的事件,检查项目其中result.type设置为PushEvent。每个这样的事件都对应于用户进行的一次git push,而该推送中的提交(按时间倒序)可以在result.payload.commits中获取。

您可以通过检查commit.author.email是否与预期匹配来过滤其他用户提交的提交。您还可以访问该对象上的shamessageurl等属性,并使用distinct属性消除多个推送中的重复提交。

总体而言,需要做更多的工作,但它也给您提供了一个更准确的表示用户实际提交内容的方法。

如果有帮助的话,这里有一些示例代码,它使用以上方法获取用户的最后一次提交(使用Node.js和octokat npm模块 实现):

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
  })

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

8

您可以使用 提交搜索API并按作者进行筛选。

您可以使用author:用户名 按作者或提交者搜索

以下是示例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'

请查看此文章了解如何创建个人访问令牌。

请记住:搜索API仅允许经过身份验证的API调用每分钟30个结果,未经身份验证的调用为10个结果,总共最多1000个结果。

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


我忘了提到完整的API是:GET /search/commits - mariaulo

7
也许其他人在以后会对此感兴趣。
  • 没有检索一个用户所有提交的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个。
    至此,您已完成。其余的取决于您想如何处理数据。

    4

    更新于2018-11-12

    下面提到的URL现在已经移动到一个单一的URL,看起来像这样:https://github.com/AurelienLourot?from=2018-10-09,但思路仍然相同。请参阅github-contribs


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

    但是,您可以通过查询非官方页面并在循环中解析它们来获取该信息:

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

    这正是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
    ...
    

    1

    2019年5月更新

    您可以通过遍历仓库并使用贡献者API来获取提交计数。这比解析事件API中的提交事件更快、更容易。

    基本上,查询用户仓库,向/users/<username>/repos发出get请求,然后迭代存储库名称,向/repos/<username>/<repo_name>/contributors发出请求。


    6
    不属于用户所有的存储库怎么办?比如向其他存储库做出的贡献。 - pgarciacamou

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