如何导出GitHub pull request中被驳回的评论至Excel?
嘿,我懂你为啥头疼——git log确实只能抓取本地提交的日志信息,但PR被驳回时的评审评论是存在GitHub平台服务器上的,和本地Git仓库的记录完全不搭边。别慌,给你两个实用方案,一步步搞定导出到Excel的需求:
GitHub CLI是官方推出的命令行工具,能直接和GitHub的API交互,比自己写脚本省心太多,而且兼容性拉满。
步骤:
安装并登录gh
去GitHub官网下载对应你系统的gh客户端(比如Windows用winget、Mac用brew,Linux用包管理器),安装完成后运行:gh auth login跟着提示完成账号登录就行。
筛选近两个月被驳回的PR
运行下面的命令,会列出所有符合条件的PR编号(已关闭且未合并的,也就是被驳回的):# Mac/Linux gh pr list --state closed --search "merged:false created:>=$(date -d '2 months ago' +%Y-%m-%d)" --json number --jq '.[] | .number' # Windows PowerShell gh pr list --state closed --search "merged:false created:>=$(Get-Date).AddMonths(-2).ToString('yyyy-MM-dd')" --json number --jq '.[] | .number'这里的
merged:false用来排除已经合并的PR,created:>=指定了两个月前的日期起点,确保只抓最近两个月的内容。批量导出评论到CSV(Excel兼容)
写个简单的脚本批量处理这些PR,把评论导出成CSV文件(Excel可以直接打开):比如Mac/Linux的bash脚本:
# 生成两个月前的日期 START_DATE=$(date -d '2 months ago' +%Y-%m-%d) # 创建CSV表头 echo "PR编号,评论者,评论内容,评论时间" > pr_review_comments.csv # 遍历符合条件的PR,导出评论 for pr_number in $(gh pr list --state closed --search "merged:false created:>=$START_DATE" --json number --jq '.[] | .number'); do gh pr view $pr_number --json comments --jq '.comments[] | [env.pr_number, .author.login, .body, .createdAt] | @csv' >> pr_review_comments.csv done运行完这个脚本,你就能得到一个
pr_review_comments.csv文件,直接用Excel打开就能看到所有被驳回PR的评论了。
如果你懂点Python,这个方案能让你更灵活地控制导出的内容格式,比如筛选特定评论者(比如仓库所有者)的评论。
步骤:
生成GitHub个人访问令牌(PAT)
在GitHub的设置里找到「Developer settings」→「Personal access tokens」,生成一个令牌,权限勾选repo(私有仓库需要,公开仓库选public_repo就行),保存好这个令牌。安装依赖库
打开终端运行:pip install requests编写导出脚本
把下面的代码保存为export_pr_comments.py,替换里面的配置参数:import requests import csv from datetime import datetime, timedelta # 替换成你的配置 OWNER = "原仓库所有者的用户名" REPO = "原仓库的名称" PAT = "你刚才生成的个人访问令牌" # 计算两个月前的时间(GitHub API用ISO格式) TWO_MONTHS_AGO = (datetime.now() - timedelta(days=60)).isoformat() + "Z" headers = {"Authorization": f"token {PAT}"} output_file = "pr_review_comments.csv" # 第一步:获取所有符合条件的PR(近两个月、已关闭、未合并) pr_numbers = [] page = 1 while True: pr_api_url = f"https://api.github.com/repos/{OWNER}/{REPO}/pulls?state=closed&page={page}&per_page=30" response = requests.get(pr_api_url, headers=headers) response.raise_for_status() prs = response.json() if not prs: break # 筛选符合条件的PR for pr in prs: if pr["created_at"] >= TWO_MONTHS_AGO and not pr["merged"]: pr_numbers.append(pr["number"]) # 如果PR创建时间早于两个月前,直接停止翻页 if pr["created_at"] < TWO_MONTHS_AGO: break page += 1 # 第二步:导出每个PR的评论到CSV with open(output_file, "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerow(["PR编号", "评论者", "评论内容", "评论时间"]) for pr_num in pr_numbers: comments_api_url = f"https://api.github.com/repos/{OWNER}/{REPO}/pulls/{pr_num}/comments" comments_response = requests.get(comments_api_url, headers=headers) comments_response.raise_for_status() comments = comments_response.json() # 遍历每个评论,写入CSV for comment in comments: # 替换评论里的换行符,避免Excel单元格错乱 cleaned_body = comment["body"].replace("\n", " ").replace("\r", "") writer.writerow([ pr_num, comment["user"]["login"], cleaned_body, comment["created_at"] ]) print(f"所有评论已成功导出到 {output_file}")运行脚本后,同样会生成一个CSV文件,直接用Excel打开即可。
额外提示:
- 如果只想导出仓库所有者的评论,可以在脚本里加个判断:
if comment["user"]["login"] == "仓库所有者用户名",只写入符合条件的评论。 - 确保你有权限访问原仓库的PR评论(公开仓库没问题,私有仓库需要令牌有对应权限)。
内容的提问来源于stack exchange,提问作者coder12349

