首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GitHub GraphQL API,如何获得提交文件的大小?

使用GitHub GraphQL API,如何获得提交文件的大小?
EN

Stack Overflow用户
提问于 2020-05-26 15:02:31
回答 1查看 639关注 0票数 1

我想绘制一个项目的文件大小随时间变化的图表。要做到这一点,我需要最后100次提交的文件大小(或者至少是那些修改它的提交)。

如何使用GitHub GraphQL API获取这些数据?

我可以了解一个项目的历史:

代码语言:javascript
复制
{ 
  repository(owner:"someOwner", name:"some-Repo") {
    defaultBranchRef{
      target {
        ...on Commit{
          history(first:100, path: "some/file/path") {
            nodes {
              committedDate
            }
          }
        }
      }
    }
  }
}

我可以在主人的头上得到文件的大小:

代码语言:javascript
复制
{
  repository(owner:"someOwner", name:"some-Repo" ) {
    object(expression: "master:some/file/path") {
      ...on Blob {
        byteSize
      }
    }
  } 
}

但以下几点不起作用:

代码语言:javascript
复制
{
  repository(owner: "someOwner", name: "some-Repo") {
    defaultBranchRef {
      target {
        ... on Commit {
          history(first: 100, path: "some/file/path") {
            nodes {
              committedDate
              repository {
                object(expression: "master:some/file/path") {
                  ... on Blob {
                    byteSize
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

它每次给出当前文件大小,而不是给定提交的文件大小。

是否有可能在一个请求中通过GraphQL API获取该数据?

EN

Stack Overflow用户

发布于 2020-05-26 19:15:21

一种方法是从tree结果中获取commit,并列出文件条目。这将工作,但将返回该提交的所有文件。例如:

代码语言:javascript
复制
{
  repository(owner: "bertrandmartel", name: "media-optimizer") {
    defaultBranchRef {
      target {
        ... on Commit {
          history(first: 100, path: "cloudformation.yml") {
            nodes {
              oid
              tree {
                entries {
                  name
                  object {
                    ...on Blob {
                      byteSize
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

然后,可以在结果中筛选正确的文件,如下所示:

代码语言:javascript
复制
TOKEN=[YOUR TOKEN]
REPO_OWNER=bertrandmartel
REPO_NAME=media-optimizer
FILE_PATH=cloudformation.yml

curl -s -H "Authorization: token $TOKEN" \
     -H  "Content-Type:application/json" \
     -d '{ 
          "query": "{repository(owner: \"'"$REPO_OWNER"'\", name: \"'"$REPO_NAME"'\") { defaultBranchRef {target {... on Commit {history(first: 100, path: \"'"$FILE_PATH"'\") {nodes {committedDate tree {entries {name object {...on Blob {byteSize}}}}}}}}}}}"
      }' https://api.github.com/graphql | jq '.data.repository.defaultBranchRef.target.history.nodes[] | 
        {
            date:.committedDate, 
            size: .tree.entries[] | select(.name=="'"$FILE_PATH"'") | .object.byteSize
        }'

它的产出:

代码语言:javascript
复制
{
  "date": "2020-01-29T17:30:58Z",
  "size": 8408
}
{
  "date": "2020-01-29T16:43:00Z",
  "size": 8030
}
{
  "date": "2020-01-29T01:50:31Z",
  "size": 7601
}

另一种不列出所有字段的方法是执行2个请求,第一个列出所有提交ID。

第一次请求:查询日期和查询日期:

代码语言:javascript
复制
query getCommitOid {
  repository(owner: "bertrandmartel", name: "media-optimizer") {
    defaultBranchRef {
      target {
        ... on Commit {
          history(first: 100, path: "cloudformation.yml") {
            nodes {
              committedDate
              oid
            }
          }
        }
      }
    }
  }
}

第二个请求:为每个提交构建别名(此处为3次提交):

代码语言:javascript
复制
query getByteSize {
  repository(owner: "bertrandmartel", name: "media-optimizer") {
    commit1: object(expression: "310fe12a847549ac33096d1f7301ea0a968c638c:cloudformation.yml") {
      ... on Blob {
        byteSize
      }
    }
    commit2: object(expression: "9eb80883322420fc1bf51b924c2c56ec8af8b109:cloudformation.yml") {
      ... on Blob {
        byteSize
      }
    }
    commit3: object(expression: "53172d2c7d439d7d97935c422c5b853a7cc5458d:cloudformation.yml") {
      ... on Blob {
        byteSize
      }
    }
  }
}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62025191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档