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

如何高效获取GitHub特定组织所有Pull Request的评论?

获取GitHub组织所有Pull Request评论的高效方法

方案一:用GitHub CLI(gh)批量导出

GitHub官方的CLI工具gh能帮你快速批量操作,比手动翻PR高效得多。

步骤:

  1. 先安装gh(官网直接下载或用包管理器安装),然后登录:gh auth login,按提示完成授权。
  2. 写个简单的bash脚本遍历组织下所有仓库、所有PR,导出评论:
ORG_NAME="你的组织名"
OUTPUT_FILE="pr_comments.txt"

# 清空输出文件
> $OUTPUT_FILE

# 遍历组织所有仓库
gh repo list $ORG_NAME --limit 1000 --json name --jq '.[].name' | while read REPO; do
  echo "正在处理仓库: $REPO" >> $OUTPUT_FILE
  # 遍历仓库所有PR(包括已合并、关闭的)
  gh pr list --repo $ORG_NAME/$REPO --state all --json number --jq '.[].number' | while read PR_NUM; do
    echo "--- PR #$PR_NUM 评论 ---" >> $OUTPUT_FILE
    # 获取PR的对话评论(PR页面的普通评论)
    gh pr view --repo $ORG_NAME/$REPO $PR_NUM --json comments --jq '.comments[] | "[" + .author.login + "] " + .body' >> $OUTPUT_FILE
    # 获取PR的代码评审评论(针对代码行的评论)
    gh pr comments --repo $ORG_NAME/$REPO $PR_NUM --json author,body,path --jq '.[] | "[" + .author.login + "] 路径:" + .path + "\n" + .body' >> $OUTPUT_FILE
    echo "" >> $OUTPUT_FILE
  done
done
  1. 替换ORG_NAME为你的组织名,运行脚本后,所有评论会输出到pr_comments.txt中。

方案二:用GitHub API写自定义脚本(以Python为例)

如果需要更灵活的处理(比如过滤特定用户、时间范围的评论),直接调用API是更好的选择。

步骤:

  1. 生成个人访问令牌(PAT):在GitHub设置里进入「Developer settings」→「Personal access tokens」,勾选repo权限(公开组织选public_repo即可)。
  2. 用Python脚本实现,自动处理API分页:
import requests

ORG_NAME = "你的组织名"
PAT = "你的个人访问令牌"
HEADERS = {"Authorization": f"token {PAT}"}
OUTPUT_FILE = "pr_comments_full.txt"

def get_all_repos(org):
    repos = []
    page = 1
    while True:
        url = f"https://api.github.com/orgs/{org}/repos?per_page=100&page={page}"
        response = requests.get(url, headers=HEADERS)
        response.raise_for_status()
        page_repos = response.json()
        if not page_repos:
            break
        repos.extend(page_repos)
        page += 1
    return repos

def get_all_prs(repo_owner, repo_name):
    prs = []
    page = 1
    while True:
        url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/pulls?state=all&per_page=100&page={page}"
        response = requests.get(url, headers=HEADERS)
        response.raise_for_status()
        page_prs = response.json()
        if not page_prs:
            break
        prs.extend(page_prs)
        page += 1
    return prs

def get_pr_comments(repo_owner, repo_name, pr_number):
    # 获取PR对话评论
    issue_comments = []
    page = 1
    while True:
        url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/issues/{pr_number}/comments?per_page=100&page={page}"
        response = requests.get(url, headers=HEADERS)
        response.raise_for_status()
        page_comments = response.json()
        if not page_comments:
            break
        issue_comments.extend(page_comments)
        page += 1
    # 获取PR代码评审评论
    review_comments = []
    page = 1
    while True:
        url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/pulls/{pr_number}/comments?per_page=100&page={page}"
        response = requests.get(url, headers=HEADERS)
        response.raise_for_status()
        page_comments = response.json()
        if not page_comments:
            break
        review_comments.extend(page_comments)
        page += 1
    return issue_comments, review_comments

# 主逻辑
with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
    repos = get_all_repos(ORG_NAME)
    for repo in repos:
        repo_name = repo["name"]
        f.write(f"=== 仓库: {repo_name} ===\n")
        prs = get_all_prs(ORG_NAME, repo_name)
        for pr in prs:
            pr_num = pr["number"]
            pr_title = pr["title"]
            f.write(f"\n--- PR #{pr_num}: {pr_title} ---\n")
            issue_comments, review_comments = get_pr_comments(ORG_NAME, repo_name, pr_num)
            
            if issue_comments:
                f.write("\n[对话评论]\n")
                for comment in issue_comments:
                    f.write(f"@{comment['user']['login']}: {comment['body']}\n\n")
            
            if review_comments:
                f.write("\n[代码评审评论]\n")
                for comment in review_comments:
                    f.write(f"@{comment['user']['login']} 路径: {comment['path']}\n{comment['body']}\n\n")
  1. 替换ORG_NAME和PAT,运行脚本后,结果会保存到指定文件中。

注意:GitHub API有速率限制(使用PAT的话每小时5000次请求),脚本会自动处理分页,不用担心中途中断。

内容的提问来源于stack exchange,提问作者Maksim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:32:49