Как клонировать все репозитории сразу из GitHub?


У меня есть учетная запись компании GitHub, и я хочу создать резервную копию всех репозиториев внутри, учитывая все новое, что может быть создано для целей автоматизации. Я надеялся что-то вроде этого:

git clone git@github.com:company/*.git 

или подобное будет работать, но это, кажется, не нравится подстановочный знак там.

есть ли способ в Git клонировать, а затем вытащить все, предполагая, что у него есть соответствующие разрешения?

19 56

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

репозиториях пользователей

клонирование всех с помощью Git репозитория URLs:

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

вот полезная функция оболочки, которая может быть добавлена в файлы запуска пользователя (с помощью 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, например, на 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 файл, затем запустить его.

спасибо Арно для кода 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 и [[организация]] на вашу организацию Github. Выходные данные (метаданные JSON repo) будут переданы в простой скрипт 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'))]"
    

есть еще и очень полезная НПМ модуль для этого. Он может не только клонировать, но и тянуть (для обновления данных у вас уже есть).

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

[{
   "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 и установленный модуль запросов:

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