我有一个公司的GitHub账户,我想备份其中的所有存储库,同时考虑到为自动化目的创建的任何新内容。我希望有这样一个东西:
git clone git@github.com:company/*.git
或类似的东西可能有效,但看起来它不喜欢通配符。
在Git中有没有一种方法可以假设拥有适当的权限,克隆然后拉取所有内容?
这是一个使用官方GitHub CLI工具gh
的简单解决方案-无需API密钥,可以处理多达4,000个私有仓库。
仅需第一次:使用gh
登录私有仓库,并按照提示操作:
gh auth login
./myorgname
文件夹下克隆任意数量的仓库。将myorgname
替换为你的组织名称:gh repo list myorgname --limit 4000 | while read -r repo _; do
gh repo clone "$repo" "$repo"
done
brew install gh
Linux或Windows - 参见GitHub安装指南
未来的保护:GitHub CLI工具将长期支持,并随着GitHub API的变化而更新。一些旧的答案可能因此不再有效。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
文件夹中创建仓库?在gh repo clone
命令中省略第二个"$repo"
参数,即可在当前目录中创建。筛选结果:
--no-archived
- 不显示已存档的仓库--source
- 仅显示非派生仓库这个脚本可以处理多达约4,000个仓库 - 参见@Ryan Fisher
的评论,并在评论中分享您的结果。
gh repo list
命令使用GitHub搜索API,在返回大量结果时进行分页。搜索的仓库数量有上限为4,000。
为了解决任何限制:
gh repo list
命令是否返回您所期望的结果gh repo list --help
命令来按语言、主题等进行过滤或者您可以使用基于API请求的不同答案,替换gh repo list
命令或整个脚本。
如果您要克隆大量存储库,可以使用GNU parallel
来加快此脚本的速度。
gh repo list <ORG_NAME> --limit <LIMIT> --json nameWithOwner --jq '.[].nameWithOwner' | \
parallel -j<JOBS> gh repo clone
gh
的内部jq
库,而不是独立的jq
。parallel
下的单独的bash -c "..."
命令中。xargs -P
并行克隆存储库-请参阅this answer。
parallel
脚本gh
编写解决方案),因为我没能找到第二页的答案。希望这个解决方案能得到赞同,以便其他人不会重复同样的错误。 - Pranasasgit branch -a
查看它们。正常的git clone
包括远程跟踪分支。您可以在主脚本的gh repo clone
之后添加命令,例如:( cd "$repo" && COMMANDS_HERE )
- 括号创建子shell以限制cd
的范围。请注意git push
- 默认情况下会推送所有分支:评论 - RichVelCNTX={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=users
和NAME=yourusername
,以下载您所有的存储库。CNTX=orgs
和NAME=yourorgname
,以下载您组织的所有存储库。最大页面大小为100,因此您必须使用正确的页面编号多次调用此函数以获取所有存储库(将PAGE
设置为要下载的所需页面编号)。
以下是执行上述操作的shell脚本: https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e
我认为用这种方式做不可能。你最好的选择是使用API查找并循环遍历一个组织的库列表。
请尝试以下步骤:
http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
ssh_url
属性。ssh_url
进行git clone
操作。这需要一些额外的工作,但为了在GitHub上拥有适当的身份验证,这是必要的。
https://api.github.com/
而不是 https://github.com/api/v3/
。 - Thomas Kelley/users/${COMPANY}/repos
路径而不是/orgs/${COMPANY}/repos
。 - Thomas Kelleyaccess_token
查询参数,因为该查询参数已被弃用。如果该令牌被您无法控制的应用程序使用,请注意由于此弃用可能导致其停止工作。 - BogeyMan要克隆您机构的所有代码库,请尝试使用以下 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
}
如果你需要克隆私有代码库,你可以在请求头中添加授权令牌(Authorization token),例如:
-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
。hub
工具。参见:
提示:
- 为提高速度,可通过为xargs
指定-P
参数设置并行进程数(-P4
= 4个进程)。
- 如果需要增加GitHub限制,请尝试通过指定API密钥进行身份验证。
- 添加--recursive
选项以递归到已注册的子模块,并更新其中的任何嵌套子模块。
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
。 - rootGHORG=company; curl "https://api.github.com/orgs/$GHORG/repos?per_page=1000" | grep -o "https://github.com/$GHORG/.*.git\b" | xargs -L1 git clone
。 - Ram这个代码片段可以在命令行中用一行命令完成任务:
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所提到的,根据GitHub文档最大页面大小为100。
如果您有超过100个存储库,则必须向您的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
。
gh repo list OWNER --limit 1000 | awk '{print $1; }' | xargs -L1 gh repo clone
其中 OWNER
可以是您的用户名或组织名。
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 {}
?access_token=YOURTOKEN
。前往“账户设置”->“应用程序”,创建一个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代码。
for each, makes a system call to 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'))]"
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/<<ORG_NAME>>/repos?per_page=200'))]"
- thisisbhavin
ghorg clone org --backup --clone-wiki --token=xxxx
即可。 - jimjam