我想绘制一个项目的文件大小随时间变化的图表。要做到这一点,我需要最后100次提交的文件大小(或者至少是那些修改它的提交)。
如何使用GitHub GraphQL API获取这些数据?
我可以了解一个项目的历史:
{
repository(owner:"someOwner", name:"some-Repo") {
defaultBranchRef{
target {
...on Commit{
history(first:100, path: "some/file/path") {
nodes {
committedDate
}
}
}
}
}
}
}我可以在主人的头上得到文件的大小:
{
repository(owner:"someOwner", name:"some-Repo" ) {
object(expression: "master:some/file/path") {
...on Blob {
byteSize
}
}
}
}但以下几点不起作用:
{
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获取该数据?
发布于 2020-05-26 19:15:21
一种方法是从tree结果中获取commit,并列出文件条目。这将工作,但将返回该提交的所有文件。例如:
{
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
}
}
}
}
}
}
}
}
}
}
}然后,可以在结果中筛选正确的文件,如下所示:
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
}'它的产出:
{
"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。
第一次请求:查询日期和查询日期:
query getCommitOid {
repository(owner: "bertrandmartel", name: "media-optimizer") {
defaultBranchRef {
target {
... on Commit {
history(first: 100, path: "cloudformation.yml") {
nodes {
committedDate
oid
}
}
}
}
}
}
}第二个请求:为每个提交构建别名(此处为3次提交):
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
}
}
}
}https://stackoverflow.com/questions/62025191
复制相似问题