如何跟踪GitHub公共仓库/组织进度并导出指标至CSV?
如何通过GitHub API跟踪公共仓库指标并导出CSV
先澄清误解
GitHub的公开API对所有公共仓库开放访问权限,不需要你是仓库所有者。只要仓库设置为public,任何人都可以调用接口获取提交、PR、Issues等数据,仅受限于API请求速率限制(匿名请求60次/小时,认证后提升至5000次/小时)。
步骤1:准备API访问(可选但推荐)
如果需要定期批量获取数据,建议生成一个个人访问令牌(PAT):
- 在GitHub账号设置中创建PAT,仅勾选
public_repo权限即可(仅用于读取公共仓库数据) - 调用API时在请求头中携带令牌,能大幅提升请求速率限制,避免频繁触发限流
步骤2:获取各指标的API调用方式
以下是获取你需要的核心指标的具体API接口及参数:
- 提交数(Commits):
调用GET /repos/{owner}/{repo}/commits,通过since和until参数指定时间范围,接口返回分页数据,可通过响应头的Link字段获取总页数,进而计算总提交数(比遍历所有页更高效)。 - 合并的PR数:
调用GET /repos/{owner}/{repo}/pulls,添加参数state=closed和merged=true,再配合since/until筛选时间范围,同样通过分页信息统计总数。 - 已解决的Issues数:
调用GET /repos/{owner}/{repo}/issues,添加参数state=closed、type=issue(排除PR,因为PR在GitHub中属于特殊类型的Issue),再加上时间范围参数,统计结果总数。
步骤3:编写脚本自动导出CSV
用Python编写简单脚本,自动获取数据并导出为CSV,示例代码如下:
import requests import csv # 配置参数 REPO_OWNER = "目标仓库所有者用户名" REPO_NAME = "目标仓库名称" START_DATE = "2024-01-01T00:00:00Z" # 开始时间,ISO 8601格式 END_DATE = "2024-06-30T23:59:59Z" # 结束时间 # 可选:填入你的个人访问令牌提升速率限制 GITHUB_TOKEN = "your_personal_access_token_here" headers = {"Authorization": f"token {GITHUB_TOKEN}"} if GITHUB_TOKEN else {} def fetch_total_count(endpoint, params): """通用函数:获取分页接口的总数据量""" params["per_page"] = 1 # 每页只取1条,通过页数计算总数 response = requests.get(endpoint, headers=headers, params=params) response.raise_for_status() # 捕获请求错误 if "Link" not in response.headers: return len(response.json()) # 解析Link头获取最后一页页码 last_link = [link for link in response.headers["Link"].split(",") if "rel=\"last\"" in link][0] last_page = int(last_link.split("page=")[1].split(">")[0]) return last_page # 获取各指标 commits_count = fetch_total_count( f"https://api.github.com/repos/{REPO_OWNER}/{REPO_NAME}/commits", {"since": START_DATE, "until": END_DATE} ) merged_pr_count = fetch_total_count( f"https://api.github.com/repos/{REPO_OWNER}/{REPO_NAME}/pulls", {"state": "closed", "merged": "true", "since": START_DATE, "until": END_DATE} ) resolved_issues_count = fetch_total_count( f"https://api.github.com/repos/{REPO_OWNER}/{REPO_NAME}/issues", {"state": "closed", "type": "issue", "since": START_DATE, "until": END_DATE} ) # 导出到CSV metrics_data = [ ["日期范围", "提交数", "合并PR数", "已解决Issues数"], [f"{START_DATE} 至 {END_DATE}", commits_count, merged_pr_count, resolved_issues_count] ] with open("github_repo_metrics.csv", "w", newline="", encoding="utf-8") as csv_file: writer = csv.writer(csv_file) writer.writerows(metrics_data) print("指标已成功导出到 github_repo_metrics.csv")
步骤4:定期运行脚本
- Windows:使用「任务计划程序」创建定时任务,指定脚本路径和运行周期
- Linux/Mac:使用
cron(Linux)或launchd(Mac)设置定时任务,例如每周一自动运行脚本更新数据
内容的提问来源于stack exchange,提问作者user9351801
相关产品推荐
相关产品推荐

