获取我们所有私人仓库的列表

问题描述 投票:0回答:3

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

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

我发现 per_page 最大值是 100 ,我怎样才能将所有存储库放入一个文件中?

谢谢

github github-api
3个回答
2
投票

您可以使用 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 ]'

1
投票

Github CLI

现在可以通过 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 个存储库

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

进一步阅读


0
投票

GitHub 在其 API 指南中有一篇名为 Traversing with Pagination 的文章,其中涵盖了分页的基础知识,还介绍了如何编写一个小脚本来收集数据

© www.soinside.com 2019 - 2024. All rights reserved.