我想获取组织github中所有私有存储库的列表。我试过了 -
curl -u user:pw -X GET https://api.github.com/orgs/xxx/repos?per_page=100 >> list.txt
我发现 per_page MAX值为100,如何将所有存储转换为一个文件?
由于
答案 0 :(得分:2)
您可以使用循环遍历每个页面的bash脚本,直到到达的最后一页为空。
过滤器可以使用jq
JSON解析器来过滤私有存储库,也可以排除分叉存储库或任何你想要的东西。
请注意,我使用personal access token进行身份验证(获取私人存储空间):
#!/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) ]'
with:
jq '[ .[] | select(.private == true) | .html_url ]'
答案 1 :(得分:0)
GitHub在其API指南中有一篇名为Traversing with Pagination的文章,其中介绍了分页的基础知识,以及如何write a small script to gather your data。
答案 2 :(得分:0)
您需要先create a personal access token,然后才能使用type=private
除非您有超过100个存储库,否则您可以这样做:
https://api.github.com/orgs/<org>/repos?per_page=100&type=private&access_token=<token>
如果需要遍历100个以上的回购协议,则必须使用一些其他脚本。
这是Vanilla 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)