【问题标题】:get a list of all our private repos获取我们所有私人仓库的列表
【发布时间】:2017-01-24 21:54:56
【问题描述】:

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

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

我发现 per_page MAX 值为 100 ,我怎样才能将我们所有的 repos 放到一个文件中?

谢谢

【问题讨论】:

    标签: github github-api


    【解决方案1】:

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

    与:

    jq '[ .[] | select(.private == true)  | .html_url ]'
    

    【讨论】:

      【解决方案2】:

      GitHub 在其 API 指南中有一篇名为 Traversing with Pagination 的文章,其中涵盖了分页的基础知识以及如何使用 write a small script to gather your data

      【讨论】:

        【解决方案3】:

        Github CLI

        现在通过 GH CLI 很容易做到这一点,它会在您登录后为您处理所有身份验证内容。

        gh repo list <username> --private
        

        手动

        你需要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 多个存储库,则必须使用一些额外的脚本。

        这是一个香草 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)
        

        进一步阅读

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-24
          • 1970-01-01
          • 2012-03-29
          • 2018-06-16
          • 2016-07-06
          • 1970-01-01
          相关资源
          最近更新 更多