【问题标题】:How to compare two branches in github with GraphQL?如何将 github 中的两个分支与 GraphQL 进行比较?
【发布时间】:2021-01-19 23:03:18
【问题描述】:

我们可以用 Github GraphQL 比较两个分支吗?

从他们的 v3 REST API 中,您可以:

/repos/:owner/:repo/compare/:base...:head

(文档:https://developer.github.com/v3/repos/commits/#compare-two-commits

这适用于 SHA、分支、标签等。

但是,我在文档中找不到等效的 GraphQL 查询。

这是我目前的尝试:

我能够分别获取每个分支的提交列表,但是,整个历史记录已加载,我只想要金丝雀分支和夜间分支之间的区别。

query{
  repository(owner:"samridh",name:"release-generator"){
    name
    branch0: ref(qualifiedName: "canary"){
      target{
        ... on Commit {
         history(first:100){
           ...CommitFragment
         }
       }
      }
    }
    branch1: ref(qualifiedName: "nightly"){
      target{
        ... on Commit {
         history(first:100){
           ...CommitFragment
         }
       }
      }
    }
  }
}
             
fragment CommitFragment on CommitHistoryConnection {
  totalCount
  nodes {
    oid
    message
    committedDate
    author {
      name
      email
    }
  }
  pageInfo {
    hasNextPage
    endCursor
  }
}

这应该是这样的:

/repos/samridh/release-generator/compare/nightly...canary

在 v3 REST API 中

【问题讨论】:

    标签: github graphql git-branch github-graphql


    【解决方案1】:

    不幸的是,在 github 社区页面的几个小时滚动之后,似乎截至目前,API 没有在 v4 上迁移,必须通过 v3 本身完成。

    但是,v3 API 仅支持 250 次提交,超出此范围的任何提交都将被忽略且不显示。不过,这可以使用 graphQL 解决。

    触发此查询以获取起点和终点:

    query getStartAndEndPoints {
      repository(owner: "samridh", name: "release-generator") {
        endPoint: ref(qualifiedName: "canary") {
          ...internalBranchContent
        }
        startPoint: ref(qualifiedName: "nightly") {
          ...internalBranchContent
        }
      }
    }
    
    fragment internalBranchContent on Ref {
      target {
        ... on Commit {
          history(first: 1) {
            edges {
              node {
                committedDate
              }
            }
          }
        }
      }
    }
    

    这将为您提供查询的开始和结束日期。

    将这些值插入到:

    query findDifference{
      repository(owner:"samridh",name:"release-generator"){
        ref(qualifiedName: "canary"){
          target{
            ... on Commit {
             history(
                      first : 100,
                      after: $(value of previous end cursor) #keep it empty first time
                      until : $(endDate),
                      since: $(startDate),
                      ){
               ...CommitFragment
             }
           }
          }
        }
      }
    }
    
    fragment CommitFragment on CommitHistoryConnection {
      totalCount
      nodes {
        oid
      }
      pageInfo {
        startCursor
        hasNextPage
        endCursor
      }
    }
    

    并提取所有的oid,一次100个(Github GraphQL一次只支持100个)

    最后,你可以调用 v3 API,同样:

    /repos/samridh/release-generator/compare/<commit1>...<commit100>
    /repos/samridh/release-generator/compare/<commit101>...<commit200>
    /repos/samridh/release-generator/compare/<commit201>...<commit300>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 2019-05-21
      • 1970-01-01
      • 2014-04-01
      相关资源
      最近更新 更多