如何从GitHub一次克隆所有的回购?
我有一个公司的GitHub帐户,我想要备份所有的仓库,以解决任何可能为自动化而创build的新function。 我希望像这样:
git clone git@github.com:company/*.git
或类似的工作,但似乎并不喜欢那里的通配符。
有没有办法在Git克隆,然后拉一切假设有适当的权限?
我不认为这样做是可能的。 您最好的select是使用API查找并循环访问组织的存储库列表。
尝试这个:
- 进入账户设置 – >应用程序创build一个API令牌
- 拨打电话:
http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
- 响应将是JSON数组对象。 每个对象都将包含关于该组织下的其中一个存储库的信息。 我认为在你的情况下,你会专门寻找
ssh_url
属性。 - 然后
git clone
每个ssh_url
。
这是一些额外的工作,但是GitHub有必要进行适当的身份validation。
在Windows和所有UNIX / LINUX系统上,使用Git Bash或任何其他terminal ,用您的用户名replaceYOURUSERNAME
,并使用:
USER=YOURUSERNAME; PAGE=1 curl "https://api.github.com/users/$USER/repos?page=$PAGE&per_page=100" | grep -e 'git_url*' | cut -d \" -f 4 | xargs -L1 git clone
最大的页面大小是100,所以你必须用正确的页面号码多次调用这个页面来获得所有的存储库(把PAGE
设置为你想要下载的页面号)。
这个要点在命令行上完成一行任务:
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]
replace为组织的名称。 并根据需要设置您的per_page
。
更新:
正如ATutorMe提到的, 根据GitHub文档 ,最大页面大小是100。
如果您有超过100个回购page
,则必须为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
。
组织存储库
要从您的组织克隆所有回购,请尝试以下shell程序:
ORG=company; curl "https://api.github.com/orgs/$ORG/repos?per_page=1000" | grep -o 'git@[^"]*' | xargs -L1 git clone
用户存储库
全部使用Git仓库URL进行克隆:
USER=foo; curl "https://api.github.com/users/$USER/repos?per_page=1000" | grep -o 'git@[^"]*' | xargs -L1 git clone
使用克隆URL克隆全部:
USER=foo; curl "https://api.github.com/users/$USER/repos?per_page=1000" | grep -w clone_url | grep -o '[^"]\+://.\+.git' | xargs -L1 git clone
如果您需要克隆私人回购,您必须插入您的API密钥(使用hub
命令应该帮助你)。 或者在头部添加授权令牌 ,方法是:
access_token=GITHUB_API_TOKEN
检查这里的例子:
- 如何使用命令行从私人回购下载GitHub发行版 。
提示:
– 要提高速度,请通过为xargs
指定-P
参数( -P4
= 4个进程)来设置并行进程数。
– 如果您需要提高GitHub限制,请尝试通过指定您的API密钥进行身份validation。
– 添加 – recursionrecursion到已注册的子模块中,并更新其中的任何嵌套子模块。
转到帐户设置 – >应用程序并创build一个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代码。
我发现@ 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"]} ]}'
用您的Github用户名replace[[USERNAME]],用您的Github组织replace[[ORGANIZATION]]。 输出(JSON回购元数据)将被传递给一个简单的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
所以,我也会添加我的答案。 :)(我发现它很简单)
获取列表(我使用“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
这python单行将会做你所需要的。 它:
- 检查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'))]"
还有一个非常有用的npm模块来做到这一点。 它不仅可以克隆,而且还可以(更新已有的数据)。
你只需要像这样创buildconfiguration:
[{ "username": "BoyCook", "dir": "/Users/boycook/code/boycook", "protocol": "ssh" }]
并做gitall clone
例如。 或者gitall pull
如果有人在寻找一个Windows解决scheme,下面是PowerShell中的一个小function来实现这个function(如果不是这样的话,我可能需要使用和不使用代理)。
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() } }
所以,在实践中,如果你想从组织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
你可以通过使用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
你可以使用开源工具来克隆一堆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