【问题标题】:How to clone all repos at once from GitHub?如何从 GitHub 一次克隆所有存储库?
【发布时间】:2022-05-11 17:20:56
【问题描述】:

我有一个公司的 GitHub 帐户,我想备份其中的所有存储库,以记录可能出于自动化目的而创建的任何新存储库。我希望是这样的:

git clone git@github.com:company/*.git 

或类似的会起作用,但它似乎不喜欢那里的通配符。

假设一个人拥有适当的权限,Git 中有没有一种方法可以克隆然后提取所有内容?

【问题讨论】:

  • 好问题。以及如何通过拉动使它们保持同步?任何答案都适用于拉动吗?
  • 我们需要一个 python 解决方案,对于我们这些不太擅长 node 或 ruby​​ 的人 ;) 或者 github 应该阅读这个并同情我们,并为此提供一个简单的 Web 界面......
  • 您可以使用ghorg,然后只需使用ghorg clone org --backup --clone-wiki --token=xxxx

标签: git github git-clone


【解决方案1】:

Windows 和所有 UNIX/LINUX 系统上,使用 Git Bash任何其他终端,替换 @ 987654327@ 通过您的用户名并使用:

CNTX={users|orgs}; NAME={username|orgname}; PAGE=1
curl "https://api.github.com/$CNTX/$NAME/repos?page=$PAGE&per_page=100" |
  grep -e 'clone_url*' |
  cut -d \" -f 4 |
  xargs -L1 git clone
  • 设置CNTX=usersNAME=yourusername,下载您的所有存储库。
  • 设置CNTX=orgsNAME=yourorgname,下载您组织的所有存储库。

最大页面大小为 100,因此您必须使用正确的页码多次调用它才能获取所有存储库(将 PAGE 设置为您要下载的所需页码)。

这是一个执行上述操作的 shell 脚本:https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e

【讨论】:

  • 纯 bash 解决方案,最简单的。供您参考,此 bash 代码几乎可以在任何 *nix 环境、Linux、Cygwin、Mingw 中执行,当然还有 Gitbash,它确实像其他人一样是终端仿真。
  • 这不适用于组织,因此不能直接回答问题。来自 Kenorb 的 This answer 确实可以处理 orgs,并且可以处理多达 1000 个存储库 - 对我来说效果更好。
  • 带身份验证: curl "api.github.com/$CNTX/$NAME/…" | grep -e 'git_url*' | cut -d \" -f 4 | xargs -L1 git clone
  • 请更新答案(2019 年 2 月):根据 GitHub API v3,您的 curl 应该转到 /orgs/ORGNAME/repos。还可能包含指向 API v3 的链接:developer.github.com/v3 此外,对于私有存储库,您需要添加 curl -u "username",然后 curl 会询问您一次密码。否则工作得很好! :)))
  • 来自 dimitry hevkoplyas 评论 stackoverflow.com/questions/19576742/… 的更新。 developer.github.com/v3 在尝试 curl 时返回 301 状态。使用这个 bash 命令 curl -u "{username}" "api.github.com/orgs{org}/repos?page=1&per_page=100" | grep -o 'git@[^"]*' | xargs -L1 git clone 工作 100%
【解决方案2】:

我认为那样做是不可能的。最好的办法是使用 API 查找并遍历组织的存储库列表。

试试这个:

  • 通过转到帐户设置 -> 应用程序来创建 API 令牌
  • 拨打电话:http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
  • 响应将是一个 JSON 对象数组。每个对象将包含有关该组织下的一个存储库的信息。我认为在您的情况下,您将专门寻找 ssh_url 属性。
  • 然后git clonessh_urls 中的每一个。

这有点额外的工作,但 GitHub 有必要进行适当的身份验证。

【讨论】:

  • 我创建了 API 令牌并从调用中获取输出,但我没有看到任何引用我所知道的我们的存储库或“ssh_url”字符串的内容。我怀疑我没有正确拨打电话。 curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>
  • 这是 GitHub Enterprise 帐户,还是 github.com?
  • 啊,我误会你了。我以为是企业帐户。代替https://github.com/api/v3/,试试https://api.github.com/
  • 我不确定您的特定公司是如何设置的,但如果它是“用户”而不是“组织”,那么您将希望使用 /users/${COMPANY}/repos 路径而不是/orgs/${COMPANY}/repos.
  • Per GitHub:请改用 Authorization HTTP 标头,因为不推荐使用 access_token 查询参数。如果您无法控制的应用正在使用此令牌,请注意它可能会因弃用而停止工作。
【解决方案3】:

组织存储库

要从您的组织中克隆所有存储库,请尝试以下 shell 单行:

GHORG=company; curl "https://api.github.com/orgs/$GHORG/repos?per_page=1000" | grep -o 'git@[^"]*' | xargs -L1 git clone

用户存储库

使用 Git 存储库 URL 克隆所有内容:

GHUSER=CHANGEME; curl "https://api.github.com/users/$GHUSER/repos?per_page=1000" | grep -o 'git@[^"]*' | xargs -L1 git clone

使用克隆 URL 克隆所有内容:

GHUSER=CHANGEME; curl "https://api.github.com/users/$GHUSER/repos?per_page=1000" | grep -w clone_url | grep -o '[^"]\+://.\+.git' | xargs -L1 git clone

这里是有用的shell函数,可以添加到用户的启动文件中(使用curl + jq):

# Usage: gh-clone-user (user)
gh-clone-user() {
  curl -sL "https://api.github.com/users/$1/repos?per_page=1000" | jq -r '.[]|.clone_url' | xargs -L1 git clone
}

私有仓库

如果您需要克隆私有存储库,您可以在标题中添加 授权令牌,例如:

-H 'Authorization: token <token>'

或在参数中传递(?access_token=TOKEN),例如:

curl -s "https://api.github.com/users/$GHUSER/repos?access_token=$GITHUB_API_TOKEN&per_page=1000" | grep -w clone_url | grep -o '[^"]\+://.\+.git' | xargs -L1 git clone

注意事项:

  • 要仅获取私有存储库,请将type=private 添加到您的查询字符串中。
  • 另一种方法是在配置 API 密钥后使用 hub

另见:


提示
- 要提高速度,通过为xargs 指定-P 参数来设置并行进程数(-P4 = 4 个进程)。
- 如果您需要提高 GitHub 限制,请尝试通过指定您的 API 密钥进行身份验证。
- 添加 --recursive 以递归到注册的子模块,并更新其中的任何嵌套子模块。

【讨论】:

  • per_page=1000 最大为 100
  • 如果不是您自己的组织,请尝试添加sed 's/git@github.com:/https:\/\/github.com\//g',如下:curl "GHORG=company; https://api.github.com/orgs/$GHORG/repos?per_page=1000" | grep -o 'git@[^"]*' | sed 's/git@github.com:/https:\/\/github.com\//g' | xargs -L1 git clone
【解决方案4】:

使用 GitHub CLI 的简单脚本(无 API 密钥)

这是一个使用官方 GitHub CLI 工具的简单解决方案,gh - 不需要 API 密钥,并且可以处理任意数量的私有存储库:

仅限第一次:使用gh 登录私人仓库,并按照提示操作:

    gh auth login

现在,在新的 ./myorgname 文件夹下克隆多达 1000 个存储库 - 将 `myorgname 替换为您的组织名称:

    gh repo list myorgname --limit 1000 | while read -r repo _; do
      gh repo clone "$repo" "$repo"
    done

设置

获取GitHub CLI tool

当 GitHub API 发生变化时,GitHub CLI 工具将得到长期支持。

可选:更新现有结帐

要更新磁盘上已有的 repo 文件夹,以及克隆新的 repos,脚本需要检查 gh repo clone 是否失败,如下所示:

    gh repo list myorgname --limit 1000 | while read -r repo _; do
      gh repo clone "$repo" "$repo" -- -q 2>/dev/null || (
        cd "$repo"
        # Handle case where local checkout is on a non-main/master branch
        # - ignore checkout errors because some repos may have zero commits, 
        # so no main or master
        git checkout -q main 2>/dev/null || true
        git checkout -q master 2>/dev/null || true
        git pull -q
      )
    done

背景

【讨论】:

  • IMO 的绝佳解决方案。我早上的大部分时间都在做这个(使用gh 编写解决方案),因为我没有转到答案的第二页。我希望这能得到支持,以免其他人重蹈覆辙。
  • 到目前为止,最容易实施的解决方案。
【解决方案5】:

This gist在命令行一行完成任务:

curl -s https://api.github.com/orgs/[your_org]/repos?per_page=200 | ruby -rubygems -e 'require "json"; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo["ssh_url"]} ]}'

[your_org] 替换为您组织的名称。如有必要,请设置您的per_page

更新:

正如 ATutorMe 所说,最大页面大小为 100,according to the GitHub docs

如果你有超过 100 个 repos,你必须在你的 url 中添加一个 page 参数,你可以为每个页面运行命令。

curl -s "https://api.github.com/orgs/[your_org]/repos?page=2&per_page=100" | ruby -rubygems -e 'require "json"; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo["ssh_url"]} ]}'

注意:默认的per_page参数是30

【讨论】:

  • 知道如何为您有权访问的私人存储库完成此操作吗?
  • 第二个不起作用,因为 & 号使其进入后台任务
  • 我在网址中添加了 &access_token= 并且效果很好
  • 第二个:page=1 (!)
  • 根据 cmets 到其他答案,per_page 参数的最大值为 100,您可以输入任何更大的数字,但您只会获得 100 个 repos
【解决方案6】:

所以,我也会添加我的答案。 :)(我发现这很简单)

获取列表(我使用过“magento”公司):

curl -si https://api.github.com/users/magento/repos | grep ssh_url | cut -d '"' -f4

使用clone_url 代替ssh_url 来使用HTTP 访问。

所以,让我们全部克隆它们! :)

curl -si https://api.github.com/users/magento/repos | \
    grep ssh_url | cut -d '"' -f4 | xargs -i git clone {}

如果您要获取私有仓库 - 只需添加 GET 参数 ?access_token=YOURTOKEN

【讨论】:

    【解决方案7】:

    转到帐户设置 -> 应用程序并创建 API 密钥
    然后在下面的脚本中插入 API 密钥、github 实例 url 和组织名称

    #!/bin/bash
    
    # Substitute variables here
    ORG_NAME="<ORG NAME>"
    ACCESS_TOKEN="<API KEY>"
    GITHUB_INSTANCE="<GITHUB INSTANCE>
    
    URL="https://${GITHUB_INSTANCE}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}"
    
    curl ${URL} | ruby -rjson -e 'JSON.load(STDIN.read).each {|repo| %x[git clone #{repo["ssh_url"]} ]}'
    

    将其保存在文件中,chmod u+x 文件,然后运行它。

    感谢 Arnaud 提供 ruby​​ 代码。

    【讨论】:

    • 这里的 GITHUB_INSTANCE 是什么?
    【解决方案8】:

    使用 Github CLI 和一些脚本来克隆命名空间下的所有(公共或私有)存储库

    gh repo list OWNER --limit 1000 | awk '{print $1; }' | xargs -L1 gh repo clone
    

    OWNER 可以是您的用户名或组织名称。

    【讨论】:

    • 这里是 - 迄今为止最简单和最新的方法
    【解决方案9】:

    这个 python one-liner 将满足您的需求。它:

    • 检查 github 以获取可用的存储库
    • 对于每个,对git clone进行系统调用

      python -c "import json, urllib, os; [os.system('git clone ' + r['ssh_url']) for r in json.load(urllib.urlopen('https://api.github.com/orgs/<<ORG_NAME>>/repos?per_page=200'))]"
      

    【讨论】:

    • 供python3使用-> python -c "import json, urllib.request, os; [os.system('git clone ' + r['clone_url']) for r in json.load(urllib.request.urlopen('https://api.github.com/orgs/&lt;&lt;ORG_NAME&gt;&gt;/repos?per_page=200'))]"
    【解决方案10】:

    我发现the gist@seancdavis 提供的评论非常有帮助,尤其是因为像原始海报一样,我想同步所有存储库以便快速访问,但其中绝大多数是私有的。

    curl -u [[USERNAME]] -s https://api.github.com/orgs/[[ORGANIZATION]]/repos?per_page=200 |
      ruby -rubygems -e 'require "json"; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo["ssh_url"]} ]}'
    

    将 [[USERNAME]] 替换为您的 github 用户名,将 [[ORGANIZATION]] 替换为您的 Github 组织。输出(JSON repo 元数据)将传递给一个简单的 ruby​​ 脚本:

    # bring in the Ruby json library
    require "json"
    
    # read from STDIN, parse into ruby Hash and iterate over each repo
    JSON.load(STDIN.read).each do |repo|
      # run a system command (re: "%x") of the style "git clone <ssh_url>"
      %x[git clone #{repo["ssh_url"]} ]
    end
    

    【讨论】:

    • 这个解决方案非常适合我。实际上,我所需要的只是将我所有的个人帐户存储库克隆到我的新本地机器上。设置新工作站非常方便。注意:为此,我必须将 .../orgs/[[organization]]/repos... 更改为 .../users/[[username]]/repos...。现在我可以快速将我所有的工作导入到不同的本地机器上。 谢谢!
    【解决方案11】:

    这是一个 Python 解决方案:

    curl -s https://api.github.com/users/org_name/repos?per_page=200 | python -c $'import json, sys, os\nfor repo in json.load(sys.stdin): os.system("git clone " + repo["clone_url"])'
    

    将 org_name 替换为您希望下载其存储库的组织或用户的名称。在 Windows 中,您可以在 Git Bash 中运行它。如果找不到 python(不在您的 PATH 等中),我发现的最简单的解决方案是将 python 替换为实际 Python 可执行文件的路径,例如: /c/ProgramData/Anaconda3/python 用于 Anaconda 安装Windows 10。

    【讨论】:

    • 最佳选择!谢谢你
    • 最小和很好的答案。
    【解决方案12】:

    我用 Python3 和 Github APIv3 做了一个脚本

    https://github.com/muhasturk/gitim

    快跑

    ./gitim
    

    【讨论】:

      【解决方案13】:
      curl -s https://api.github.com/orgs/[GITHUBORG_NAME]/repos | grep clone_url | awk -F '":' '{ print $2 }' | sed 's/\"//g' | sed 's/,//' | while read line; do git clone "$line"; done
      

      【讨论】:

      • 请为您的解决方案添加说明。这样其他有类似问题的人就能更轻松地理解您的解决方案!
      • 一个细节是需要像?page=2这样的传递页码。
      【解决方案14】:

      我尝试了上面的一些命令和工具,但认为它们太麻烦了,所以我编写了另一个命令行工具来执行此操作,称为 github-dl

      使用它(假设你已经安装了 nodejs)

      npx github-dl -d /tmp/test wires
      

      这将从wires 获取所有repo 的列表,并使用您在CLI 上提供的授权详细信息(用户/密码)将信息写入test 目录。

      详细一点

      1. 请求身份验证(支持 2FA)
      2. 通过 Github API 获取用户/组织的存储库列表
      3. 为此进行分页,因此支持 100 多个 repo

      它实际上并没有克隆 repos,而是编写一个 .txt 文件,您可以将其传递给 xargs 进行克隆,例如:

      cd /tmp/test
      cat wires-repo-urls.txt | xargs -n2 git clone
      
      # or to pull
      cat /tmp/test/wires-repo-urls.txt | xargs -n2 git pull
      

      也许这对你有用;这只是几行 JS,所以应该很容易适应您的需求

      【讨论】:

        【解决方案15】:

        简单的解决方案:

        NUM_REPOS=1000
        DW_FOLDER="Github_${NUM_REPOS}_repos"
        mkdir ${DW_FOLDER}
        cd ${DW_FOLDER}
        for REPO in $(curl https://api.github.com/users/${GITHUB_USER}/repos?per_page=${NUM_REPOS} | awk '/ssh_url/{print $2}' | sed 's/^"//g' | sed 's/",$//g') ; do git clone ${REPO} ; done
        

        【讨论】:

          【解决方案16】:

          克隆所有非分叉的公共和私有存储库:

          首先创建一个Personal token 进行身份验证,确保它具有所有 repo 权限

          curl -u username:token https://api.github.com/user/repos\?page\=1\&per_page\=100 |
            jq -r 'map(select(.fork == false)) | .[] | .ssh_url' |
            xargs -L1 git clone
          

          克隆你的要点:

          curl https://api.github.com/users/{username}/gists\?page\=1\&per_page\=100 |
             jq -r ".[] | .git_pull_url +\" '\" + (.files|keys|join(\"__\") + \"'\")" |
             xargs -L1 git clone
          

          这个jq 命令很复杂,因为 gists 的 repo 的名称是哈希值,因此该命令将所有文件名连接为 repo 的名称


          您可以使用jq 任意过滤JSON

          安装:sudo apt-get install jq

          在上面的示例中,我使用以下代码过滤掉了 forkscurl ... | jq -r 'map(select(.fork == false))' ... -- 这对于在您发出随意拉取请求的地方不克隆存储库很有用

          jq 支持一些非常高级的功能。 man jq 是你的朋友


          Github 的 API 网址

          • 您的存储库(需要身份验证): https://api.github.com/user/repos\?page\=1\&amp;per_page\=100
          • 任何用户: https://api.github.com/users/{other_username}/repos\?page\=1\&amp;per_page\=100
          • 组织: https://api.github.com/orgs/orgname/repos\?page\=1\&amp;per_page\=100

          Github API Docs for repos

          【讨论】:

            【解决方案17】:

            还有一个非常有用的npm module 可以做到这一点。它不仅可以克隆,还可以拉取(更新您已有的数据)。

            你只需像这样创建配置:

            [{
               "username": "BoyCook",
               "dir": "/Users/boycook/code/boycook",
               "protocol": "ssh"
            }]
            

            并以gitall clone 为例。或gitall pull

            【讨论】:

              【解决方案18】:

              如果有人在寻找 Windows 解决方案,可以使用 PowerShell 中的一个小功能来解决问题(如果不是我需要它在使用和不使用代理的情况下工作的事实,可能是 oneliner/alias)。

              function Unj-GitCloneAllBy($User, $Proxy = $null) {
                  (curl -Proxy $Proxy "https://api.github.com/users/$User/repos?page=1&per_page=100").Content 
                    | ConvertFrom-Json 
                    | %{ $_.clone_url } 
                    # workaround git printing to stderr by @wekempf aka William Kempf
                    # https://github.com/dahlbyk/posh-git/issues/109#issuecomment-21638678
                    | %{ & git clone $_ 2>&1 } 
                    | % { $_.ToString() }
              }
              

              【讨论】:

                【解决方案19】:

                因此,在实践中,如果您想从组织 FOO 克隆与 BAR 匹配的所有 repos,您可以使用下面的单行代码,这需要 jq 和常用的 cli 实用程序

                curl 'https://api.github.com/orgs/FOO/repos?access_token=SECRET' |
                  jq '.[] |
                  .ssh_url' |
                  awk '/BAR/ {print "git clone " $0 " & "}' |
                  sh
                

                【讨论】:

                  【解决方案20】:

                  另一个带有 cmets 的 shell 脚本从用户那里克隆所有存储库(公共和私有):

                  #!/bin/bash
                  
                  USERNAME=INSERT_USERNAME_HERE
                  PASSWORD=INSERT_PASSWORD_HERE
                  
                  # Generate auth header
                  AUTH=$(echo -n $USERNAME:$PASSWORD | base64)
                  
                  # Get repository URLs
                  curl -iH "Authorization: Basic "$AUTH https://api.github.com/user/repos | grep -w clone_url > repos.txt
                  
                  # Clean URLs (remove " and ,) and print only the second column
                  cat repos.txt | tr -d \"\, | awk '{print $2}'  > repos_clean.txt
                  
                  # Insert username:password after protocol:// to generate clone URLs
                  cat repos_clean.txt |  sed "s/:\/\/git/:\/\/$USERNAME\:$PASSWORD\@git/g" > repos_clone.txt
                  
                  while read FILE; do
                      git clone $FILE
                  done <repos_clone.txt
                  
                  rm repos.txt & rm repos_clone.txt
                  

                  【讨论】:

                    【解决方案21】:

                    在您的 ~/.bashrc file 中创建一个 bash 别名/函数

                    我通过在 ~/.bashrc file 中创建别名/bash 函数为我的团队解决了这个问题

                    步骤

                    打开终端或 linux shell 并打开您的 ~/.bashrc file:

                    sudo nano ~/.bashrc
                    

                    添加此功能:

                    CloneAll() {
                        # Make the url to the input github organization's repository page.
                        ORG_URL="https://api.github.com/orgs/${1}/repos?per_page=200";
                    
                        # List of all repositories of that organization (seperated by newline-eol).
                        ALL_REPOS=$(curl -s ${ORG_URL} | grep html_url | awk 'NR%2 == 0' \
                                    | cut -d ':' -f 2-3 | tr -d '",');
                    
                        # Clone all the repositories.
                        for ORG_REPO in ${ALL_REPOS}; do
                            git clone ${ORG_REPO}.git;
                        done
                    }
                    

                    保存并关闭你的 ~/.bashrc 文件,然后关闭终端——你需要这样做,否则新的函数不会初始化:

                    打开新终端并试用:

                    CloneAll <your_github_org_name>
                    

                    示例:如果您的个人 github 存储库 URL 称为 https://github.com/awesome-async,则该命令将是

                    CloneAll awesome-async
                    

                    重要

                    第一个变量ORG_URL末尾的per_page=200设置将被克隆的repos数量,所以要特别注意:

                    ORG_URL="https://api.github.com/orgs/${1}/repos?per_page=200";  <---- make sure this is what you want
                    

                    希望这会有所帮助! :)

                    【讨论】:

                    • 似乎最大。 per_page 的值为 100 ...对于大型组织,添加页码作为第二个参数,它非常适合我的需求 ...repos?page=${2}&amp;per_page=100";
                    【解决方案22】:

                    您可以使用curl 获取存储库列表,然后使用 bash 循环遍历该列表:

                    GIT_REPOS=`curl -s curl https://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN} | grep ssh_url | awk -F': ' '{print $2}' | sed -e 's/",//g' | sed -e 's/"//g'`
                    for REPO in $GIT_REPOS; do
                      git clone $REPO
                    done
                    

                    【讨论】:

                      【解决方案23】:

                      您可以使用开源工具克隆一堆 github 存储库:https://github.com/artiomn/git_cloner

                      例子:

                      git_cloner --type github --owner octocat --login user --password user https://my_bitbucket

                      使用来自api.github.com 的 JSON API。 您可以在 github 文档中查看代码示例: https://developer.github.com/v3/

                      或者那里:

                      https://github.com/artiomn/git_cloner/blob/master/src/git_cloner/github.py

                      【讨论】:

                        【解决方案24】:

                        只克隆私有仓库,给定一个访问密钥,并给定安装了 python 3 和 requests 模块:

                        ORG=company; ACCESS_KEY=0000000000000000000000000000000000000000; for i in $(python -c "import requests; print(' '.join([x['ssh_url'] for x in list(filter(lambda x: x['private'] ,requests.get('https://api.github.com/orgs/$ORG/repos?per_page=1000&access_token=$ACCESS_KEY').json()))]))"); do git clone $i; done;
                        

                        【讨论】:

                          【解决方案25】:

                          一个 Python3 解决方案,包括通过 Link Header 进行详尽的分页。

                          先决条件:


                          import json
                          import requests
                          from requests.auth import HTTPBasicAuth
                          import links_from_header
                          
                          respget = lambda url: requests.get(url, auth=HTTPBasicAuth('githubusername', 'githubtoken'))
                          
                          myorgname = 'abc'
                          nexturl = f"https://api.github.com/orgs/{myorgname}/repos?per_page=100"
                          
                          while nexturl:
                              print(nexturl)
                              resp = respget(nexturl)
                          
                              linkheads = resp.headers.get('Link', None)
                              if linkheads:
                                  linkheads_parsed = links_from_header.extract(linkheads)
                                  nexturl = linkheads_parsed.get('next', None)
                              else:
                                  nexturl = None
                          
                              respcon = json.loads(resp.content)
                              with open('repolist', 'a') as fh:
                                  fh.writelines([f'{respconi["full_name"]}\n' for respconi in respcon])
                          

                          然后,您可以使用xargsparallel 和:cat repolist | parallel -I% hub clone %

                          【讨论】:

                            【解决方案26】:

                            如果您在这样的列表中有存储库列表,那么这个 shell 脚本可以工作:

                            user="https://github.com/user/"
                            
                            declare -a arr=("repo1", "repo2")
                            
                            for i in "${arr[@]}"
                            
                            do
                            
                               echo $user"$i"
                            
                               git clone $user"$i"
                            
                            done 
                            

                            【讨论】:

                            【解决方案27】:

                            我创建了一个示例批处理脚本。您可以从 github.com 下载所有私有/公共存储库。下载存储库后,它会自动转换为 zip 文件。

                            @echo off
                            setlocal EnableDelayedExpansion
                            SET "username=olyanren"
                            SET "password=G....."
                            set "mypath=%cd%\"
                            SET "url=https://%username%:%password%@github.com/%username%/"
                            FOR /F "tokens=* delims=" %%i in (files.txt) do (
                            SET repo=%%i
                            rmdir /s /q !repo!
                            git clone "!url!!repo!.git"
                            cd !repo!
                            echo !mypath!
                            git archive --format=zip -o "!mypath!!repo!.zip" HEAD
                            cd ..
                            )
                            

                            注意:files.txt 文件应仅包含存储库名称,例如:

                            repository1
                            repository2
                            

                            【讨论】:

                              【解决方案28】:

                              这里的主流答案没有考虑到 Github API 最多只会返回 100 个存储库,尽管您可以在 per_page 中指定。如果您要克隆一个拥有超过 100 个存储库的 Github 组织,则必须按照 API 响应中的分页链接。

                              我写了CLI tool to do just that

                              clone-github-org -o myorg
                              

                              这会将myorg 组织中的所有存储库克隆到当前工作目录。

                              【讨论】:

                                【解决方案29】:

                                对于您可以通过私有存储库访问的组织:

                                curl -u <YOUR_GITHUB_USERNAME> -s https://api.github.com/orgs/<ORG_NAME>/repos?per_page=200 | ruby -rubygems -e ’require “json”; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo[“html_url”]} ]}'
                                

                                它使用html_url,因此您不需要access_token,只需在提示时输入您的github密码即可。

                                【讨论】:

                                • 使用 API 密码的基本身份验证已被弃用,并且很快将不再有效。请访问 [deprecating-password-auth] (developer.github.com/changes/…),了解有关建议的解决方法和删除日期的更多信息。
                                【解决方案30】:
                                """
                                Clone all public Github Repos
                                
                                https://developer.github.com/v3/repos/#list-repositories-for-a-user
                                """
                                
                                import urllib.request, base64
                                import json
                                import os
                                
                                
                                def get_urls(username):
                                    url = f"https://api.github.com/users/{username}/repos?per_page=200"
                                    request = urllib.request.Request(url)
                                    result = urllib.request.urlopen(request)
                                    return json.load(result)
                                
                                
                                if __name__ == "__main__":
                                    for r in get_urls("MartinThoma"):
                                        if not os.path.isdir(r["name"]):
                                            print(f"Clone {r['name']}...")
                                            os.system("git clone " + r["ssh_url"])
                                        else:
                                            print(f"SKIP {r['name']}...")
                                

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2021-12-31
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2016-10-09
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多