如何用curl和jq结合GitHub API统计每位贡献者带标签的PR数量
单页快速统计(PR数量≤100时可用)
你可以直接扩展现有命令的jq逻辑,实现按贡献者分组统计各标签对应的PR数量:
curl -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/jina-ai/jina/pulls?state=opened&per_page=100" | jq ' reduce .[] as $pr ({}; # 按贡献者登录名分组 .[$pr.user.login] as $current_stats | # 遍历当前PR的所有标签做计数累加 (reduce $pr.labels[]? as $label ($current_stats; .[$label.name] += 1)) as $new_stats | .[$pr.user.login] = $new_stats )'
输出格式为{贡献者用户名: {标签名: 对应PR数量}}。
全量统计脚本(适配PR数量超过100的场景)
GitHub API默认分页返回数据,单页最多100条,PR数量较多时可以用如下完整脚本拉取所有数据再统计:
#!/bin/bash # 配置参数 REPO="jina-ai/jina" PR_STATE="opened" # 可选值:opened/closed/all # 如果是私有仓库或需要更高请求速率限制,填写你的GitHub个人访问令牌 # GITHUB_TOKEN="你的令牌" TEMP_FILE=$(mktemp) page=1 while :; do echo "正在拉取第${page}页PR数据..." >&2 # 构造请求头 HEADERS=(-H "Accept: application/vnd.github.v3+json") [ -n "$GITHUB_TOKEN" ] && HEADERS+=(-H "Authorization: token $GITHUB_TOKEN") # 发起请求,同时获取响应状态码 resp=$(curl -s -w "\n%{http_code}" "${HEADERS[@]}" "https://api.github.com/repos/${REPO}/pulls?state=${PR_STATE}&per_page=100&page=${page}") http_code=$(echo "$resp" | tail -n1) resp_body=$(echo "$resp" | head -n -1) if [ "$http_code" != "200" ]; then echo "API请求失败,状态码:${http_code},响应:${resp_body}" >&2 exit 1 fi # 当前页无数据时终止拉取 if [ "$(echo "$resp_body" | jq 'length')" -eq 0 ]; then break fi # 合并多页数据到临时文件 if [ $page -eq 1 ]; then echo "$resp_body" > "$TEMP_FILE" else jq -s 'add' "$TEMP_FILE" <(echo "$resp_body") > "${TEMP_FILE}.tmp" && mv "${TEMP_FILE}.tmp" "$TEMP_FILE" fi page=$((page+1)) done # 输出统计结果 echo "=== 统计结果 ===" jq ' reduce .[] as $pr ({}; .[$pr.user.login] as $user_stats | (reduce $pr.labels[]? as $label ($user_stats; .[$label.name] += 1)) as $new_user_stats | .[$pr.user.login] = $new_user_stats )' "$TEMP_FILE" # 清理临时文件 rm -f "$TEMP_FILE" "${TEMP_FILE}.tmp"
可选逻辑调整
- 如果仅统计带特定标签的PR,比如仅统计带
bug标签的PR,可将jq逻辑中遍历PR的部分修改为:reduce (.[] | select(any(.labels[].name; . == "bug"))) as $pr (...) - 如果不需要细分标签,仅统计每个贡献者创建的带任意标签的PR总数量,可将jq逻辑简化为:
reduce .[] as $pr ({}; if ($pr.labels | length) > 0 then .[$pr.user.login] += 1 else . end) - 未认证的GitHub API请求速率限制为每小时60次,配置
GITHUB_TOKEN后可提升至每小时5000次,避免拉取大仓库时触发限流。
内容的提问来源于stack exchange,提问作者Олег Чернявский
相关产品推荐
相关产品推荐

