Как клонировать все РЕПО сразу из GitHub?
У меня есть учетная запись компании GitHub, и я хочу создать резервную копию всех репозиториев внутри, учитывая все новое, что может быть создано для целей автоматизации. Я надеялся на что-то вроде этого:
git clone git@github.com:company/*.git 
или подобное будет работать, но, похоже, ему не нравится подстановочный знак.
есть ли способ в Git клонировать и затем вытащить все, если у вас есть соответствующие разрешения?
19 ответов
Я не думаю, что это можно сделать таким образом. Лучше всего найти и просмотреть список репозиториев организации с помощью API.
попробуйте это:
- создайте маркер API, перейдя в Настройки учетной записи - > приложения
- позвоните по адресу: http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
- ответом будет массив объектов JSON. Каждый объект будет содержать информацию об одном из репозиториев этой организации. Я думаю, что в вашем случае, вы будете искать специально для ssh_urlсобственность.
- затем git cloneкаждый из этихssh_urls.
это немного дополнительная работа, но для GitHub необходимо иметь правильную аутентификацию.
On  Windows и 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 'git_url*' |
  cut -d \" -f 4 |
  xargs -L1 git clone
установите CNTX=users и NAME=yourusername, чтобы загрузить все ваши репозитории. Установите CNTX=orgs и NAME=yourorgname, чтобы загрузить все репозитории вашей организации.
максимальный размер страницы-100, поэтому вы должны вызвать это несколько раз с правильным номером страницы, чтобы получите все ваши репозитории (set PAGE до нужного номера страницы, которую вы хотите загрузить).
вот сценарий оболочки для сценария оболочки, который делает выше: https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e
в этом суть выполняет задачу в одной строке командной строки:
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 параметр для вашего url, и вы можете запустить команду для каждой страницы.
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"]} ]}'
примечание: по умолчанию
организация репозиториев
чтобы клонировать все РЕПО из вашей организации, попробуйте следующую оболочку one-liner:
GHORG=company; curl "https://api.github.com/orgs/$GHORG/repos?per_page=1000" | grep -o 'git@[^"]*' | xargs -L1 git clone
репозиториях пользователей
клонирование всех с использованием URL-адресов репозитория Git:
GHUSER=CHANGEME; curl "https://api.github.com/users/$GHUSER/repos?per_page=1000" | grep -o 'git@[^"]*' | xargs -L1 git clone
клонирование всех с помощью 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
вот полезная функция оболочки, которая может быть добавлена в файлы запуска пользователя (используя curl+jq):
# Usage: gh-clone-user (user)
gh-clone-user() {
  curl -sL "https://api.github.com/users//repos?per_page=1000" | jq -r '.[]|.clone_url' | xargs -L1 git clone
}
частная хранилища
Если вам нужно клонировать отдельный РЕПО, вы можете добавить маркер авторизации либо в заголовке, Как:
-H 'Authorization: token <token>'
или передать его в param (?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
другой способ-использовать hub после настройки ключа API.
Регистрация вот еще один пример:
подсказки:
 - чтобы увеличить скорость, установите количество параллельных процессов, указав  на xargs (-P4 = 4 процесса).
- Если вам нужно поднять ограничения GitHub, попробуйте аутентифицировать, указав свой ключ API.
- добавить --recursive для рекурсии в зарегистрированные подмодули и обновления любых вложенных подмодулей в течение.
 перейдите в Настройки учетной записи - > приложение и создайте ключ API
Затем вставьте ключ API, url экземпляра github и имя организации в сценарий ниже
#!/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 файл, затем запустить его.
спасибо Арно для кода 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"]} ]}'
замените [[USERNAME]] своим именем пользователя github и [[ORGANIZATION]] своей организацией Github. Выходные данные (метаданные РЕПО 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
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 one-liner сделает то, что вам нужно. Это:
- проверяет github на наличие доступных репозиториев
- 
для каждого, делает системный вызов к git clonepython -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 для этого. Он может не только клонировать, но и тянуть (обновлять данные у вас уже есть).
вы просто создаете такую конфигурацию:
[{
   "username": "BoyCook",
   "dir": "/Users/boycook/code/boycook",
   "protocol": "ssh"
}]
и gitall clone например. Или gitall pull
в случае, если кто-то ищет решение 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() }
}
Итак, на практике, если вы хотите клонировать все репозитории из организации FOO, которые соответствуют BAR, вы можете использовать однострочный ниже, который требует jq не и общие утилиты cli
curl 'https://api.github.com/orgs/FOO/repos?access_token=SECRET' |
  jq '.[] |
  .ssh_url' |
  awk '/BAR/ {print "git clone "  " & "}' |
  sh
Я создал модуль pip для этого. Работает на Windows, Linux и OSX.
https://github.com/zeusofjuice/starclone
можно клонировать РЕПО с помощью:
starclone <user> 
есть несколько флагов, которые вы можете указать из файла справки или из README.
Вы можете получить список репозиториев с помощью 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 }' | 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
используйте JSON API из api.github.com.
Вы можете увидеть пример кода в документации github:
https://developer.github.com/v3/
или здесь:
https://github.com/artiomn/git_cloner/blob/master/src/git_cloner/github.py
клонировать только частные репозитории, учитывая ключ доступа и установленный модуль 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;
curl -s https://api.github.com/orgs/[GITHUBORG_NAME]/repos | grep clone_url | awk -F '":' '{ print  }' | sed 's/\"//g' | sed 's/,//' | while read line; do git clone "$line"; done
решение Python3, которое включает исчерпывающее разбиение на страницы через Link заголовок.
предпосылки:
- по API на GitHub "Личный Токен Доступа"
- pip3 install links-from-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 %
Если у вас есть список репозиториев в подобный список, то работает скрипт:
user="https://github.com/user/"
declare -a arr=("repo1", "repo2")
for i in "${arr[@]}"
do
   echo $user"$i"
   git clone $user"$i"
done 
