如何从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 

我用Python3和Github APIv3创build了一个脚本

https://github.com/muhasturk/gitim

赶紧跑

 ./gitim 

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

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