如何在GitHub组织中搜索含指定文件的仓库并按文件创建时间排序
GitHub仓库按文件创建时间排序的搜索方案
一、组织内搜索含特定文件的仓库并按文件创建时间排序
GitHub原生搜索(包括高级搜索)无法直接按文件创建时间对仓库排序,只能借助GitHub GraphQL API实现,步骤如下:
1. 你的GraphQL查询问题分析
你提供的查询所有仓库返回Null,大概率是这几个原因:
- 分支名错误:很多仓库默认分支是
main而非master,需确认目标仓库的默认分支 - 文件路径错误:
xyz.yaml是否在仓库根目录?如果在子目录,路径要写全(比如docs/xyz.yaml) - 权限不足:你的账号没有访问该组织私有仓库的权限
2. 可运行的查询示例
文件本身没有创建时间字段,需通过其首次提交记录获取创建时间。以下查询会返回组织内仓库的文件存在状态及首次提交时间:
{ organization(login: "MyOrg") { repositories(first: 100) { nodes { name defaultBranchRef { name target { ... on Commit { # 获取文件的首次提交记录 history(first: 1, path: "xyz.yaml") { nodes { committedDate # 文件首次提交时间(即创建时间) } } } } } # 检查文件是否存在 fileStatus: object(expression: "${defaultBranchRef.name}:xyz.yaml") { ... on Blob { exists: true } ... on MissingObject { exists: false } } } } } }
3. 排序处理
GraphQL API无法直接跨仓库按文件首次提交时间排序,需将查询结果导出后,在本地筛选出fileStatus.exists: true的仓库,再按committedDate字段排序。
二、全网搜索含特定字符串的仓库并按文件创建时间排序
同样,原生搜索不支持按文件创建时间排序,需通过GraphQL API分两步处理:
1. 查询含特定字符串的仓库及对应文件
先搜索包含目标字符串的仓库,再在每个仓库内定位到对应文件,获取其首次提交时间:
{ search(query: "your-specific-string in:file", type: REPOSITORY, first: 50) { nodes { ... on Repository { name owner { login } # 定位仓库内包含目标字符串的文件 targetFiles: search(query: "your-specific-string in:file", type: CODE, first: 1, repo: "${owner.login}/${name}") { nodes { ... on Blob { path repository { defaultBranchRef { target { ... on Commit { # 获取文件首次提交时间 history(first: 1, path: "${path}") { nodes { committedDate } } } } } } } } } } } } }
2. 排序处理
将查询结果导出后,筛选出存在目标文件的仓库,按committedDate字段在本地完成排序。
内容的提问来源于stack exchange,提问作者Gary Niemen
相关产品推荐
相关产品推荐

