获取我们所有私人回购的清单

时间:2017-01-24 21:54:56

标签: github github-api

我想获取组织github中所有私有存储库的列表。我试过了 -

curl -u user:pw -X GET  https://api.github.com/orgs/xxx/repos?per_page=100 >> list.txt 

我发现 per_page MAX值为100,如何将所有存储转换为一个文件?

由于

3 个答案:

答案 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个回购

如果需要遍历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)

进一步阅读