我想在 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
}
}
}
}
}
}
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)[]'