【问题标题】:Github API - retrieve user commits?Github API - 检索用户提交?
【发布时间】:2014-03-19 03:39:22
【问题描述】:

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

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

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

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

  2. 从 feed 中获取 repo 名称。

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

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

【问题讨论】:

  • 使用 graphql 对此有何更新?

标签: api github github-api


【解决方案1】:

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

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

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

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

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

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

    • API 链接 - api.github.com/users/:user/repos
    • :user 替换为您想要的用户。
  2. 对于每个存储库,获取该用户创作的提交列表。

    • 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 存储库。

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

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

    这正是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
        })
      

      【讨论】:

      猜你喜欢
      • 2017-05-09
      • 2019-03-25
      • 2018-04-02
      • 2022-08-19
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多