我想获取我们组织 github 中所有私有存储库的列表。我试过了 -
curl -u user:pw -X GET https://api.github.com/orgs/xxx/repos?per_page=100 >> list.txt
我发现 per_page 最大值是 100 ,我怎样才能将所有存储库放入一个文件中?
谢谢
您可以使用 bash 脚本循环遍历每个页面,直到到达的最后一页为空。
jq
JSON 解析器来过滤私有存储库,您还可以排除分叉存储库或任何您想要的内容。
请注意,我使用个人访问令牌进行身份验证(以获取私人存储库):
#!/bin/bash
# change those vars :
GITHUB_ORG=docker
GITHUB_ACCESS_TOKEN=12345666799897950400303332323
OUTPUT_FILE=repo_list.json
loop=0
index=1
TMP_FILE=tmpfile.txt
PER_PAGE=100
rm -f $TMP_FILE
echo "[]" > $OUTPUT_FILE
while [ "$loop" -ne 1 ]
do
data=`curl -s "https://api.github.com/orgs/$GITHUB_ORG/repos?access_token=$GITHUB_ACCESS_TOKEN&page=$index&per_page=$PER_PAGE"`
check_error=`echo "$data" | jq 'type!="array"'`
if [ "$check_error" == "true" ]; then
echo "access token is invalid"
exit 1
fi
filtered=`echo "$data" | jq '[ .[] | select(.private == true) ]'`
if [ "$filtered" == "[]" ]; then
loop=1
else
echo "$filtered" > $TMP_FILE
concat=`jq -s add $TMP_FILE $OUTPUT_FILE`
echo "$concat" > $OUTPUT_FILE
size=`jq '. | length' $OUTPUT_FILE`
echo "computed $index page - fetched total repo size of : $size"
index=$((index+1))
fi
done
如果只想拥有存储库 URL 数组而不是整个 JSON 对象,请替换:
jq '[ .[] | select(.private == true) ]'
与:
jq '[ .[] | select(.private == true) | .html_url ]'
现在可以通过 GH CLI 轻松完成此操作,它会在您登录后为您处理所有身份验证内容。
gh repo list <username> --private
您需要创建个人访问令牌,然后您可以使用
type=private
进行过滤
除非你有超过 100 个仓库,否则你可以这样做:
https://api.github.com/orgs/<org>/repos?per_page=100&type=private&access_token=<token>
如果您需要遍历超过 100 个存储库,则必须使用一些额外的脚本。
这是一个普通 JS 示例,您可以将其粘贴到浏览器控制台中
let orgName = 'YOUR_ORG_NAME'
let access_token = 'YOUR_ACCESS_TOKEN'
let baseUrl = `https://api.github.com/orgs/${orgName}/repos`
let params = {
type: 'private',
page: 1,
per_page: 10,
access_token
}
let repos = [], json = []
do {
let queryString = new URLSearchParams(params).toString()
let url = `${baseUrl}?${queryString}`
let resp = await fetch(url)
json = await resp.json()
repos.push(...json)
params.page++
} while (json.length == params.per_page)
console.log(repos)
GitHub 在其 API 指南中有一篇名为 Traversing with Pagination 的文章,其中涵盖了分页的基础知识,还介绍了如何编写一个小脚本来收集数据。