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:USERNAME
search 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/<username>/repos
发出get请求的用户repos
然后遍历存储库名称,向/repos/<username>/<repo_name>/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
是否符合您的预期来过滤这些内容以忽略其他用户所做的任何提交。您还可以访问该对象上的sha
、message
和url
等属性,并且可以使用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 - 检索用户提交?的主要内容,如果未能解决你的问题,请参考以下文章