Как клонировать все репозитории сразу из 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_url
s.это немного дополнительная работа, но для 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 и общие утилиты clicurl '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
заголовок.предпосылки:
- по 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 %