如何用Python GitHub库远程检测PR分支是否落后于基准分支?
检测PR分支是否落后基准分支(无需本地克隆)
核心思路
主流Git平台(如GitHub、GitLab)的API不会直接返回PR分支是否落后的属性,但可以通过分支提交对比接口实现远程检测,完全无需克隆仓库:
- 先筛选出目标PR,获取其基准分支与PR分支的基础信息
- 调用分支对比接口,直接获取两个分支的提交差异统计
具体实现步骤
步骤1:筛选目标PR列表
请求PR列表时,通过参数过滤出开放状态、标题含DEVELOPERS-XXXX的PR。每个PR对象会返回base(基准分支信息)和head(PR分支信息),包含分支名、最新提交SHA等关键字段。步骤2:对比分支提交差异
对每个PR,调用分支对比接口:- GitHub:
GET /repos/{owner}/{repo}/compare/{base_ref}...{head_ref},返回的behind_by字段即为PR分支落后基准分支的提交数 - GitLab:
GET /projects/{id}/repository/compare,返回的behind字段对应落后提交数
当返回的落后数值大于0时,说明PR分支已落后于基准分支。
- GitHub:
示例Python代码片段(GitHub场景)
import requests # 替换为实际信息 GITHUB_TOKEN = "your_token_here" REPO_OWNER = "your_repo_owner" REPO_NAME = "your_repo_name" headers = {"Authorization": f"token {GITHUB_TOKEN}"} # 获取符合条件的开放PR(处理分页) def fetch_target_prs(): pr_list = [] page = 1 while True: search_url = f"https://api.github.com/search/issues?q=is:open+is:pr+repo:{REPO_OWNER}/{REPO_NAME}+title:DEVELOPERS-XXXX&page={page}" res = requests.get(search_url, headers=headers) res.raise_for_status() data = res.json() if not data["items"]: break pr_list.extend(data["items"]) page += 1 return pr_list # 检测单个PR是否落后基准分支 def check_pr_status(pr): base_branch = pr["base"]["ref"] head_branch = pr["head"]["ref"] compare_url = f"https://api.github.com/repos/{REPO_OWNER}/{REPO_NAME}/compare/{base_branch}...{head_branch}" res = requests.get(compare_url, headers=headers) res.raise_for_status() compare_data = res.json() behind_count = compare_data.get("behind_by", 0) return { "pr_number": pr["number"], "title": pr["title"], "behind_count": behind_count, "is_behind": behind_count > 0 } # 主逻辑 if __name__ == "__main__": target_prs = fetch_target_prs() for pr in target_prs: status = check_pr_status(pr) status_desc = f"落后{status['behind_count']}个提交" if status['is_behind'] else "与基准分支同步" print(f"PR #{status['pr_number']} [{status['title']}]: {status_desc}")
注意事项
- 替换代码中的令牌、仓库所有者和仓库名为实际值
- 注意平台API的调用次数限制,必要时添加请求间隔
- 其他Git平台可参考对应API文档调整接口路径和字段名称
内容的提问来源于stack exchange,提问作者Syed Faraz Umar
相关产品推荐
相关产品推荐

