如何高效获取GitHub特定组织所有Pull Request的评论?
获取GitHub组织所有Pull Request评论的高效方法
方案一:用GitHub CLI(gh)批量导出
GitHub官方的CLI工具gh能帮你快速批量操作,比手动翻PR高效得多。
步骤:
- 先安装
gh(官网直接下载或用包管理器安装),然后登录:gh auth login,按提示完成授权。 - 写个简单的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
- 替换
ORG_NAME为你的组织名,运行脚本后,所有评论会输出到pr_comments.txt中。
方案二:用GitHub API写自定义脚本(以Python为例)
如果需要更灵活的处理(比如过滤特定用户、时间范围的评论),直接调用API是更好的选择。
步骤:
- 生成个人访问令牌(PAT):在GitHub设置里进入「Developer settings」→「Personal access tokens」,勾选
repo权限(公开组织选public_repo即可)。 - 用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")
- 替换
ORG_NAME和PAT,运行脚本后,结果会保存到指定文件中。
注意:GitHub API有速率限制(使用PAT的话每小时5000次请求),脚本会自动处理分页,不用担心中途中断。
内容的提问来源于stack exchange,提问作者Maksim
相关产品推荐
相关产品推荐

