Как клонировать все РЕПО сразу из 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 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 для этого. Он может не только клонировать, но и тянуть (обновлять данные у вас уже есть).

вы просто создаете такую конфигурацию:

[{
   "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 заголовок.

предпосылки:


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