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

GitHub GraphQL查询仓库fork列表总数与forkCount不符如何解决

数值差异原因
  • 两个字段统计口径存在本质区别,和接口权限、查询写法无关:
    • forkCount与网页端展示的fork总数口径一致,是仓库创建至今累计触发的fork行为总计数,不会因为后续fork被用户删除、因违规被平台移除、fork所属账号被封禁/注销而扣减数值,属于累计行为计数,不是当前存活可访问的fork仓库数量。
    • forks字段返回的实体列表与totalCount,仅统计当前处于正常存活状态、且请求认证主体有权限访问的直接fork仓库。所有已经被删除、被平台移除、所属账号不可用的fork,都不会出现在这个列表中,也不会被计入forks.totalCount,这部分就是观测到的1.6万左右差值的来源。
  • 已知fork仓库可见性属性无法修改,因此可以排除「部分fork被转为私有、当前请求无权限查看」的干扰,差值全部来自已经不存在公开访问入口的fork条目。
全量可访问fork数据(含时间戳)获取方法

已经被删除/移除的fork没有公开可查询的接口,任何公开API都无法获取这部分条目的任何信息,可拉取到的是所有当前存活可访问的fork,操作步骤如下:

  • 提前生成具备public_repo权限的GitHub个人访问令牌(PAT),将令牌携带在请求头中发起调用,避免匿名请求的权限限制导致公开fork数据漏读。
  • 调用GraphQL接口时对forks字段添加排序、分页参数,单页最大拉取100条,使用游标分页循环拉取全量数据,参考基础查询语句如下:
query GetRepoForks($repoOwner: String!, $repoName: String!, $cursor: String) {
  repository(owner: $repoOwner, name: $repoName) {
    forks(
      first: 100,
      after: $cursor,
      orderBy: {field: CREATED_AT, direction: ASC}
    ) {
      pageInfo {
        endCursor
        hasNextPage
      }
      nodes {
        createdAt
        nameWithOwner
        url
        # 可在此处添加需要的其他fork仓库字段
      }
    }
  }
}
  • 分页逻辑:每次请求后判断pageInfo.hasNextPage字段,若值为true,则将本次返回的pageInfo.endCursor作为下一次请求的cursor变量值,循环发起请求直到hasNextPage为false,即可拿到所有现存可访问fork的时间戳等信息。
  • 注意:分页终止判断不要依赖forks.totalCount数值,直接以hasNextPage返回结果为准,避免接口计数缓存、延迟导致数据漏拉。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 07:06:35