如何通过GitHub GraphQL API获取Issue项目变更时间线?
通过GitHub GraphQL API获取Issue的项目变更时间线
你当前的查询仅捕获了AddedToProjectEvent,但Issue页面时间线中的项目变更还包含移除项目、ProjectV2字段值修改等多种事件类型。要获取完整的历史变更记录,需要扩展timelineItems的类型匹配,覆盖所有与项目相关的时间线事件。
修改后的GraphQL查询示例
query Repository($cursor: String, $timelineCursor: String) { repository(owner: "Company", name: "Repository") { id url issues(first: 20, after: $cursor) { nodes { number title # 当前项目信息(保留原有逻辑) projectItems(first: 10) { nodes { project { title } fieldValues(first: 20) { totalCount nodes { ... on ProjectV2ItemFieldSingleSelectValue { id name optionId } } } } } # 扩展项目相关的时间线事件 timelineItems(first: 50, after: $timelineCursor) { edges { __typename node { # 旧版Project(V1)相关事件 ... on AddedToProjectEvent { createdAt databaseId projectColumnName project { title } } ... on RemovedFromProjectEvent { createdAt databaseId project { title } } # ProjectV2相关事件 ... on ProjectV2ItemAddedEvent { createdAt databaseId project { title number } } ... on ProjectV2ItemRemovedEvent { createdAt databaseId project { title number } } # ProjectV2字段值变更事件(核心:追踪状态/字段修改历史) ... on ProjectV2ItemFieldChangedEvent { createdAt databaseId field { ... on ProjectV2SingleSelectField { name } } # 旧值与新值 previousValue { ... on ProjectV2ItemFieldSingleSelectValue { name optionId } } newValue { ... on ProjectV2ItemFieldSingleSelectValue { name optionId } } } } } pageInfo { hasNextPage endCursor } } } pageInfo { hasNextPage endCursor } } # 保留原有项目元信息查询(如需) projectsV2(first: 1) { totalCount nodes { databaseId title id items(first: 10) { nodes { id type databaseId project { number } } } } } projectV2(number: 8) { closed closedAt createdAt databaseId fullDatabaseId id number public readme resourcePath shortDescription template updatedAt url viewerCanClose viewerCanReopen viewerCanUpdate title fields(first: 10) { nodes { ... on ProjectV2SingleSelectField { id name } } totalCount edges { node { ... on ProjectV2SingleSelectField { createdAt dataType databaseId id name updatedAt options { id name } } } } } repositories(first: 5) { totalCount totalDiskUsage edges { node { name } } } } } }
关键改进说明
- 覆盖全量项目事件类型:新增了
RemovedFromProjectEvent(旧版项目移除)、ProjectV2ItemAddedEvent/ProjectV2ItemRemovedEvent(ProjectV2增减)、ProjectV2ItemFieldChangedEvent(ProjectV2字段值变更),这些是Issue时间线中项目变更的核心事件。 - 字段变更细节:
ProjectV2ItemFieldChangedEvent中包含previousValue和newValue,可以直接获取字段修改前后的状态,满足团队规划分析中对变更轨迹的追踪需求。 - 分页支持:为
timelineItems新增了$timelineCursor变量,用于遍历单条Issue的所有时间线记录(避免因first限制遗漏历史数据)。 - 关联项目元信息:在事件中添加了
project { title, number },方便直接识别变更所属的项目。
注意事项
- 若团队使用的是新版Project(V2),重点关注
ProjectV2ItemAddedEvent、ProjectV2ItemRemovedEvent和ProjectV2ItemFieldChangedEvent即可;若仍在使用旧版Project,则保留AddedToProjectEvent和RemovedFromProjectEvent。 - 调用API时需处理双层分页:外层是Issue列表的分页(
$cursor),内层是单条Issue时间线的分页($timelineCursor)。 - 确保API token拥有
repo或project相关权限,避免因权限不足无法获取数据。
内容的提问来源于stack exchange,提问作者evilfish
相关产品推荐
相关产品推荐

