如何在 Github 组织中搜索包含特定文件的存储库(并按该文件的创建日期对返回的存储库进行排序)

问题描述 投票:0回答:1

我想在 GitHub 组织中搜索包含特定文件的存储库,并返回按该文件的创建日期排序的存储库。

另一种方法是在 GitHub 上搜索包含特定字符串的存储库 - 然后再次返回按包含该字符串的文件的创建日期排序的存储库。

我尝试过使用 GitHub 搜索、GitHub 高级搜索和使用 Graphiql。我也尝试过询问 ChatGPT - 但似乎无法让它工作。

这是我在 Graphiql 中得到的最接近的结果。如果找到该文件,则应返回 Null;如果未找到,则返回文件的文本。但这段代码只是为每个存储库返回 Null。

{
organization(login: "MyOrg") {
    repositories(first: 100, orderBy: {field: CREATED_AT, direction: DESC}) {
      nodes {
        name
        createdAt
        hasMkdocsYml: object(expression: "master:xyz.yaml") {
          ... on Blob {
            text
          }
        }
      }
    }
  }
}
github graphql github-api
1个回答
0
投票

我只能想到如何通过两遍来做。首先使用

gh search code
(即旧版搜索 API),然后迭代结果以通过文件路径的最旧提交 (commits API) 检索文件创建日期。

类似这样的:

filename=somefile.md
owner=username

gh search code --owner "$owner" --filename "$filename" --json repository,path \
    --jq 'map([.repository.nameWithOwner, .path])[] | @tsv' \
    | while IFS=$'\t' read -r repo path; do
        repo=$repo gh api -X GET "repos/$repo/commits" -f path="$path" \
            --jq 'last | {repo: $ENV.repo, date: .commit.author.date}'
    done \
    | jq -n '[inputs] | sort_by(.date)'

这会生成一个看起来像这样的对象列表

[
  {
    "date": "2023-12-22T11:01:53Z",
    "repo": "owner/repo1"
  },
  {
    "date": "2024-01-08T14:09:37Z",
    "repo": "owner/repo2"
  }
]

从最旧到最新排序。

  • 如果更改该文件的提交超过 30 次,您可以使用

    /commits
    (最大 100)
     增加对 
    -f per_page=50

    端点的调用的页面大小
  • 如果提交超过 100 次,则必须检索多个页面,这会变得相当复杂

  • 这可能无法处理文件重命名

  • 如果您只想要存储库名称,您可以将最终的 jq 命令修改为类似的内容

    jq -rn '[inputs] | sort_by(.date) | map(.repo)[]'
    
© www.soinside.com 2019 - 2024. All rights reserved.