Как клонировать все РЕПО сразу из 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
репозиториях пользователей
клонирование всех с использованием 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
заголовок.
предпосылки:
- по 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