You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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,提问作者Олег Чернявский

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 23:36:07