如何从 GitHub 一次性克隆所有回购协议?

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

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

或类似的工作,但它似乎不喜欢通配符。

在 Git 中有没有一种方法可以克隆然后在拥有适当权限的情况下提取所有内容?

161478 次浏览

我觉得那样做是不可能的。最好的办法是使用 API 查找并循环遍历一个组织的存储库列表。

试试这个:

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

这需要一些额外的工作,但是对于 GitHub 来说,有必要进行适当的身份验证。

因此,在实践中,如果您想从组织 FOO中克隆所有与 BAR匹配的回购协议,您可以使用下面的一行程序,它需要 JQ和常见的 cli 实用程序

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

转到帐户设置-> 应用程序,并创建一个 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提供的红宝石密码。

这个要点 在命令行的一行中完成任务:

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,根据 GitHub 的文档

如果你有超过100个回购协议,你将不得不添加一个 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

我发现在 大意@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

这个 python 一行程序可以满足您的需要。它:

  • 检查你可用的回购协议
  • 对于每一个,进行 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'))]"
    

组织资料库

要从你的组织克隆所有回购协议,请尝试下面的 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以递归到已注册的子模块中,并更新内部的任何嵌套子模块。

窗户和所有 UNIX/LINUX系统上,使用 Git Bash任何其他航站楼,用用户名替换 YOURUSERNAME,并使用:

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

我用 Python 3和 Github APIv3编写了一个脚本

Https://github.com/muhasturk/gitim

快跑

./gitim

还有一个非常有用的 Npm 模块来做到这一点。它不仅可以克隆,还可以提取(用于更新已有的数据)。

你只需要像这样创建配置:

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

例如做 gitall clone或者 gitall pull

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

如果有人在寻找 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() }
}

所以,我也要加上我的回答:)(我发现这很简单)

获取列表(我使用了“ 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

您可以使用开源工具克隆一组 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

为了只克隆私有回购协议,给定一个访问密钥,并给定安装了 python 3和 request 模块:

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;
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

Python 3解决方案,包括通过 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])

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

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

user="https://github.com/user/"


declare -a arr=("repo1", "repo2")


for i in "${arr[@]}"


do


echo $user"$i"


git clone $user"$i"


done

我创建了一个示例批处理脚本。您可以从 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 ..
)

注意: < em > files.txt 文件应该只包含如下存储库名称:

repository1
repository2

简单的解决办法:

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

五月十九日汇报

对组织使用 bash 命令(包括私有回购)

curl -u "{username}" "https://api.github.com/orgs/{org}/repos?page=1&per_page=100" | grep -o 'git@[^"]*' | xargs -L1 git clone

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

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

npx github-dl -d /tmp/test wires

这将从 wires获得所有回购的列表,并使用 CLI 上提供的授权细节(用户/通行证)将信息写入 test目录。

具体来说

  1. 请求认证(支持2FA)
  2. 通过 Github API 获取用户/org 的回购协议列表
  3. 做这个分页,所以超过100回购的支持

它实际上并不克隆回购协议,而是编写一个 .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 的几行代码,所以应该很容易根据您的需要进行调整

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

我写了一篇 CLI 工具可以做到这一点:

clone-github-org -o myorg

这将把 myorg组织中的所有存储库复制到当前的工作目录。

另一个带注释的 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

对于你可以通过私人回购获得的组织:

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 密码即可。

克隆所有不属于“叉子”的公开和私人回购协议:

首先创建一个用于身份验证的 私人信物,确保它具有 所有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

Install: sudo apt-get install jq安装: sudo apt-get install jq

在上面的示例中,我使用以下代码过滤掉了 叉子: curl ... | jq -r 'map(select(.fork == false))' ...—— 有用的不克隆回购,你已经随意拉请求

Jq 支持一些非常高级的特性


Github 的 API 地址

  • 您的回购协议(需要认证) : https://api.github.com/user/repos\?page\=1\&per_page\=100
  • 任何用户: https://api.github.com/users/{other_username}/repos\?page\=1\&per_page\=100
  • Orgs: https://api.github.com/orgs/orgname/repos\?page\=1\&per_page\=100

用于回购的 Github API 文档

~/.bashrc file中创建 bash 别名/func

我在 ~/.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 文件,然后关闭终端——您需要这样做,否则 new func 将不会初始化:

打开新的终端并试用:

CloneAll <your_github_org_name>

示例 : 如果您的个人 github repo URL 被称为 https://github.com/awesome-async,则命令为

CloneAll awesome-async

很重要

第一个变量 ORG_URL末尾的 per_page=200设置将被克隆的回购协议的数量,因此要特别注意:

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

希望这个有用! :)

"""
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']}...")

要克隆所有你自己的私人和公共回购协议,只需生成一个具有回购协议访问权限的新访问令牌,并使用以下方法:

(用您自己的访问令牌和用户名替换)

for line in $(curl https://api.github.com/user/repos?access_token=ACCESS_TOKEN_HERE  | grep -o "git@github.com:YOUR_USER_NAME/[^ ,\"]\+");do git clone $line;done

这将克隆当前文件夹中的所有回购协议

这是一个很小的 bash 程序,你可以把它粘贴到终端,然后点击回车

你可以使用像 GitHub 存档这样的工具,它允许你用一个简单的工具克隆/拉公共和私人回购协议、组织回购协议和要点。

至于自动化,你可以设置 GitHub Archive 每天运行一次,或者每周运行一次,它会跳过那些被克隆的,然后引入新的更改,因为上一次它运行的是所有其他的。

资料来源: https://github.com/Justintime50/github-archive

下面是一个 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 用于 Windows 10中的 Anaconda 安装。

下面是使用 PowerShell 的 Windows 版本

$name="facebook" #either username or org_name


$api_url="https://api.github.com/users/$($name)/repos?per_page=200"


$repos=Invoke-WebRequest -UseBasicParsing -Uri $api_url |ConvertFrom-Json


foreach ($repo in $repos)
{
Write-Host  "Cloning via SSH URL  $($repo.ssh_url)"
git clone $repo.ssh_url
}

当我想快速复制我所有的回购协议时,我会这样做:

for i in `echo https://github.com/user/{repox,repoy,repoz,repob}`; do git clone $i; done

这里有一种方法可以获得用户的所有要点,其中考虑到 github 的新 API 和分页规则..。

用途:

python3 gist.py bgoonz

另外... 每个克隆将是它自己的回购,可以得到相当内存密集的驱动器... 你可以删除 git 回购递归使用:


find . \( -name ".git" -o -name ".gitignore" -o -name ".gitmodules" -o -name ".gitattributes" \) -exec rm -rf -- {} +


如果你想把它们全部克隆到你现有的仓库中... ... 当你运行这个命令的时候,确保你不在你的仓库最外面的文件夹中,否则它会删除你的仓库。Git 文件夹就像它会删除属于 gist 的文件一样不加区分。

语言: Python

#!/usr/bin/env python3


import os
import sys
import json
import hashlib
import requests


from subprocess import call
from concurrent.futures import ThreadPoolExecutor as PoolExecutor


def download_all_from_user(user: str):
    

next_page = True
page = 1
    

while next_page:
        

url = f"https://api.github.com/users/{user}/gists?page={page}"
        

response = requests.get(url)


if not len(response.json()):
next_page = False
else:
page += 1


download_all(response.json())


def download_all(gists: list):
with PoolExecutor(max_workers=10) as executor:
for _ in executor.map(download, gists):
pass


def download(gist):
    

target = gist["id"] + hashlib.md5(gist["updated_at"].encode('utf-8')).hexdigest()
    

call(["git", "clone", gist["git_pull_url"], target])


description_file = os.path.join(target, "description.txt")
    

with open(description_file, "w") as f:
f.write(f"{gist['description']}\n")


# Run


user = sys.argv[1]


download_all_from_user(user)

使用 GitHub CLI 的简单脚本(没有 API 键)

这里有一个简单的解决方案,使用官方的 GitHub CLI 工具,gh-不需要 API 密钥,可以处理任何数量的私人回购。

第一次只: 登录与 gh私人回购协议,并按照提示:

gh auth login

这将在一个新的 ./myorgname文件夹下克隆任意数量的回购协议。用你的组织名称替换 myorgname:

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

设置

获得 GitHub CLI 工具:

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

可选项: 更新现有的签出

为了更新磁盘上已有的回购文件夹,以及克隆新的回购文件,脚本需要检查 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

小费

  • 不想在 ./myorgname文件夹中创建回购协议?将第二个 "$repo"参数删除到 gh repo clone,以便在工作目录中创建它们
  • 超过1000回购? 增加 --limit参数
  • 在 Windows 上? 在 适用于 Windows 的 Git的一部分 Git Bash 中运行这些脚本

有用的选择:

  • --no-archived-省略归档存储库
  • 仅显示非叉子

背景资料

使用 Github CLI和一些脚本来克隆名称空间下的所有(公共或私有)回购协议

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

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

获取存储库名称列表的一个简单方法是浏览到 Web 浏览器中列出 org 回购协议的页面,然后通过 JavaScript 提取它:

Array.from(document.querySelectorAll('[itemprop="name codeRepository"]')).map(function(item){ return item.text.replace(/\s/g,'') })

如果愿意,您可以轻松地调整此代码以生成实际的 git clone命令。

这样做的好处是您不需要为 API 键或命令行提取操心。

一个可能的缺点是,如果 Github 更改了他们的站点设计或代码,您可能需要更改此代码。

我想建议另一个选项,这可能比这里张贴的一些脚本更容易。mergestat是一个命令行工具,可用于从 GitHub 克隆所有 org 存储库,如 这一页所述。

mergestat "SELECT clone('https://github.com/mergestat/'|| name) AS path FROM github_org_repos('mergestat')" -v --clone-dir my-dir

这不是该工具的主要用途,但是它的副作用很有用(它是用 SQL 查询 git 存储库的一种方法)。充分披露,我是维护者/创建者,但想在这里分享,因为这是一个相当频繁的用例/问题,我们从用户,我希望 mergestat可以提供一个简单的解决方案。

欢迎收看 二零二二年:

首先安装这个

gh extension install matt-bartel/gh-clone-org

然后这里有一个非常简单的命令来实现这一点

gh clone-org my_org_name

Github CLI现在有了一个扩展 给你

此扩展有助于按照组织名称克隆和更新现有存储库。

建议从 Github CLI问题清单 给你

我们现在可以使用 gh 并行克隆5个回收函数

export org=<org|gh-handle>
gh repo list $org | cut -f1 | xargs -n 1 -P 5 gh repo clone

对于更多的并行任务,我们可以将 P5增加到我们想要的任何数字

与其他人类似,我还编写了一个用于导出 github 数据的实用工具。与其他软件不同的是,它从 github 下载分页的数据,所以一次可以下载100多个回购协议/其他列表数据,并且还支持下载许多其他数据,比如用 所有的树枝克隆回购协议,用 下载问题和公关作为 JSON 和 HTML 报告,下载你的星号回购协议列表等等。

你可以通过

npx github-takeout

或从 给你下载二进制文件。你可以在 https://github.com/lukasbach/github-takeout/找到更多关于它的功能和工作原理的信息

更简单的方法是使用 github cli 获取 sshurl 并使用 git 命令进行克隆。

gh repo list --json sshUrl --jq '.[].sshUrl' | xargs -n1 git clone