清风迷人 2021-04-27 11:11 采纳率: 50%
浏览 17

GitHub GraphQL API怎么在仓库没有Release的情况下获取仓库的所有tag?

'''
query { 
  repository(owner:"madler", name:"zlib") {
      releases(last:100) {
      		totalCount
          nodes {
              name
              tagName
          }
          pageInfo {
              startCursor
              hasPreviousPage
          }
      }
  }
}
'''

我是这样查询的,但是遇到没有Release的仓库就获取不到内容,比如madler/zlib这个仓库

  • 写回答

1条回答 默认 最新

  • ζ小菜鸡 优质创作者: python技术领域 2023-05-11 12:54
    关注

    在没有Release的情况下获取仓库的所有tag可以通过以下步骤:

    1.使用GitHub GraphQL API中的repository查询来获取仓库的所有标签(tag)和提交(commit)的SHA值,示例查询如下:

    query {
      repository(owner: "owner_name", name: "repo_name") {
        refs(refPrefix: "refs/tags/", first: 100, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {
          edges {
            node {
              name
              target {
                ... on Commit {
                  oid
                }
              }
            }
          }
        }
      }
    }
    

    在查询中,我们使用了refs来获取仓库中所有的标签,refPrefix参数用于指定查询的前缀为refs/tags/,first参数用于指定最多返回的标签数目,orderBy参数用于指定标签的排序方式,这里我们按标签的提交日期进行降序排序。

    2.对查询结果进行处理,提取出所有的标签名称和对应的提交SHA值。
    示例代码如下:

    import requests
    
    def get_all_tags(owner, repo):
        query = """
        query {
          repository(owner: "%s", name: "%s") {
            refs(refPrefix: "refs/tags/", first: 100, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {
              edges {
                node {
                  name
                  target {
                    ... on Commit {
                      oid
                    }
                  }
                }
              }
            }
          }
        }
        """ % (owner, repo)
    
        response = requests.post('https://api.github.com/graphql', json={'query': query},
                                 headers={'Authorization': 'bearer YOUR_ACCESS_TOKEN'})
    
        data = response.json()
        tags = []
        for edge in data['data']['repository']['refs']['edges']:
            tag_name = edge['node']['name']
            commit_sha = edge['node']['target']['oid']
            tags.append((tag_name, commit_sha))
    
        return tags
    
    # 示例查询
    tags = get_all_tags("owner_name", "repo_name")
    print(tags)
    

    以上代码中,我们使用了Python requests库来向GitHub GraphQL API发送查询请求,其中YOUR_ACCESS_TOKEN需要替换成你自己的GitHub Access Token。查询结果中的data字段包含了所有标签的名称和对应的提交SHA值,我们将它们提取出来并以元组的形式存储在tags列表中返回。

    注意:如果仓库过多,可能需要使用分页查询来获取所有标签。

    评论 编辑记录

报告相同问题?