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

如何通过Octokit的request API获取合并PR到基础分支的用户名

获取已合并PR的合并者用户名(Octokit.request 实现)

要获取已合并PR的合并者用户名,核心是利用GitHub REST API返回的merged_by字段(该字段包含合并者的用户信息,其中login即为用户名)。以下是两种可行的实现方式:

方式一:在PR列表请求中直接获取合并者信息

如果希望一次性从列表接口拿到合并者数据,需要在请求头中指定完整字段的媒体类型,确保merged_by被返回:

const octokit = require("@octokit/rest")({ auth: "YOUR_GITHUB_TOKEN" });

async function fetchMergedPRMergers() {
  const owner = "你的仓库所有者用户名";
  const repo = "仓库名称";
  let page = 1;
  const mergedPRMergers = [];

  while (true) {
    const response = await octokit.request("GET /repos/{owner}/{repo}/pulls", {
      owner,
      repo,
      state: "all",
      per_page: 100, // 单页最大返回100条,适配分页
      page,
      headers: {
        Accept: "application/vnd.github.full+json" // 请求完整字段,包含merged_by
      }
    });

    // 筛选已合并PR并提取合并者用户名
    const pageMergers = response.data
      .filter(pr => pr.merged_at !== null)
      .map(pr => ({
        pr编号: pr.number,
        合并者用户名: pr.merged_by?.login || "未知"
      }));

    mergedPRMergers.push(...pageMergers);

    // 终止分页循环:当返回结果不足100条时,说明已到最后一页
    if (response.data.length < 100) break;
    page++;
  }

  console.log(mergedPRMergers);
}

fetchMergedPRMergers();

方式二:先获取已合并PR编号,再逐个请求详情

如果列表接口未返回merged_by(或你只需要特定PR的合并者),可以先收集已合并PR的编号,再单独请求每个PR的详情接口获取合并者信息:

const octokit = require("@octokit/rest")({ auth: "YOUR_GITHUB_TOKEN" });

async function fetchMergedPRMergers() {
  const owner = "你的仓库所有者用户名";
  const repo = "仓库名称";
  let page = 1;
  const mergedPRNumbers = [];

  // 第一步:收集所有已合并PR的编号
  while (true) {
    const prListResponse = await octokit.request("GET /repos/{owner}/{repo}/pulls", {
      owner,
      repo,
      state: "all",
      per_page: 100,
      page
    });

    const pageMergedPRs = prListResponse.data
      .filter(pr => pr.merged_at !== null)
      .map(pr => pr.number);

    mergedPRNumbers.push(...pageMergedPRs);

    if (prListResponse.data.length < 100) break;
    page++;
  }

  // 第二步:逐个请求PR详情,提取合并者用户名
  const mergedPRMergers = [];
  for (const prNumber of mergedPRNumbers) {
    const prDetailResponse = await octokit.request("GET /repos/{owner}/{repo}/pulls/{pull_number}", {
      owner,
      repo,
      pull_number: prNumber
    });

    mergedPRMergers.push({
      pr编号: prNumber,
      合并者用户名: prDetailResponse.data.merged_by?.login || "未知"
    });
  }

  console.log(mergedPRMergers);
}

fetchMergedPRMergers();

注意事项

  • 替换YOUR_GITHUB_TOKEN为你的个人访问令牌,需具备仓库的读取权限(私有仓库需repo权限)。
  • 处理GitHub API的速率限制:如果PR数量较多,建议添加请求延迟,或检查响应头的X-RateLimit-Remaining字段避免触发限制。
  • 兜底处理:极少数情况下,可能存在merged_at非空但merged_by为空的情况,代码中通过|| "未知"做了兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:26:31