如何通过GitHub API获取GitHub仓库的精确贡献者数量?
问题分析与解决方案
GitHub仓库页面显示的贡献者数量和REST API /contributors 端点返回的数量存在差异,核心原因是两者的统计逻辑完全不同,具体差异点和解决方法如下:
差异来源
1. PR合并方式的提交归因差异
当PR以** squash合并或变基合并**的方式被合并时,原PR作者的提交会被重写,git提交历史中的作者会变为执行合并的维护者。REST API的/contributors端点是基于原始git提交历史的作者统计,因此不会将原PR作者计入;但GitHub仓库页面的贡献者统计会识别这些PR的原作者,并将其纳入总数。
2. 匿名贡献者的覆盖范围不同
你添加的anon=true参数仅能包含使用未关联GitHub账号邮箱提交的匿名贡献者,但页面统计还会覆盖其他间接贡献场景:
- 通过GitHub Web界面编辑文件、使用默认noreply邮箱提交的用户
- 提交被维护者cherry-pick后,原作者仍被页面统计的情况
3. REST API的统计规则限制
REST API的/contributors端点默认仅统计有直接推送到仓库权限并产生提交的用户;而仓库页面的贡献者统计会包含所有发起过被合并PR的用户,即使他们没有仓库推送权限。
解决方案:使用GraphQL API获取与页面一致的统计
要得到和仓库页面完全一致的贡献者数量,需要使用GitHub的GraphQL API,它的统计逻辑和页面完全对齐。示例查询如下:
query { repository(owner:"Azure", name:"azure-sdk-for-go") { contributors(first: 1) { totalCount } } }
你可以通过Python的requests库调用GraphQL API,示例代码如下:
import requests def get_contributor_count(owner, repo): query = """ query { repository(owner:"%s", name:"%s") { contributors(first: 1) { totalCount } } } """ % (owner, repo) response = requests.post( "https://api.github.com/graphql", json={"query": query}, headers={"Authorization": "Bearer YOUR_GITHUB_TOKEN"} ) return response.json()["data"]["repository"]["contributors"]["totalCount"] print(get_contributor_count("Azure", "azure-sdk-for-go"))
注:需要替换
YOUR_GITHUB_TOKEN为你的GitHub个人访问令牌(拥有仓库读取权限即可)。
内容的提问来源于stack exchange,提问作者Setu Kumar Basak
相关产品推荐
相关产品推荐

