Как клонировать все репозиции сразу из GitHub?
У меня есть учетная запись компании GitHub, и я хочу создать резервную копию всех репозиториев внутри, учитывая все новое, которое может быть создано для автоматизации. Я надеялся что-то вроде этого:
git clone [email protected]:company/*.git
или подобное сработало бы, но, похоже, это не похоже на шаблон.
Есть ли способ в Git клонировать, а затем тянуть все, если у вас есть соответствующие разрешения?
Ответы
Ответ 1
Я не думаю, что это можно сделать так. Лучше всего найти и прокрутить список репозиториев Организации с помощью 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 необходимо иметь правильную аутентификацию.
Ответ 2
В 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, поэтому вам нужно несколько раз позвонить по этому номеру с правильным номером страницы, чтобы получить все ваши репозитории (установите PAGE
на нужный номер страницы, который вы хотите загрузить).
Вот сценарий оболочки, который делает выше: https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e
Ответ 3
Организация хранилищ
Чтобы клонировать все репозитории из вашей организации, попробуйте следующую однострочную оболочку:
GHORG=company; curl "https://api.github.com/orgs/$GHORG/repos?per_page=1000" | grep -o '[email protected][^"]*' | xargs -L1 git clone
Репозитории пользователей
Клонирование всех с использованием URL репозитория Git:
GHUSER=CHANGEME; curl "https://api.github.com/users/$GHUSER/repos?per_page=1000" | grep -o '[email protected][^"]*' | 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/$1/repos?per_page=1000" | jq -r '.[]|.clone_url' | xargs -L1 git clone
}
Частные репозитории
Если вам нужно клонировать частные репозитории, вы можете добавить токен авторизации в своем заголовке, например:
-H 'Authorization: token <token>'
или передать его в параметре (?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
Заметки:
- Чтобы получить только личные репозитории, добавьте
type=private
в строку запроса. - Другой способ - использовать
hub
после настройки ключа API.
Смотрите также:
Подсказки :
- Чтобы увеличить скорость, установите количество параллельных процессов, указав параметр -P
для xargs
(-P4
= 4 процесса).
- Если вам нужно повысить лимиты GitHub, попробуйте выполнить аутентификацию, указав свой ключ API.
- Добавьте --recursive
для входа в зарегистрированные подмодули и обновите все вложенные подмодули внутри.
Ответ 4
Эта суть выполняет задачу в одной строке в командной строке:
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"]} ]}'
Примечание. Параметр per_page
умолчанию per_page
30
.
Ответ 5
Зайдите в Настройки аккаунта → Приложение и создайте ключ 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
файл, затем запустите его.
Спасибо Арно за код рубина.
Ответ 6
Итак, я тоже добавлю свой ответ.:) (я нашел это просто)
Список извлечения (я использовал компанию 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
Ответ 7
Я нашел комментарий в gist @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 и [[ОРГАНИЗАЦИЯ]] в вашей организации Github. Выходные данные (метаданные JSON repo) будут переданы в простой ruby script:
# 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
Ответ 8
Я создал script с Python3 и Github APIv3
https://github.com/muhasturk/gitim
Просто запустите
./gitim
Ответ 9
curl -s https://api.github.com/orgs/[GITHUBORG_NAME]/repos | grep clone_url | awk -F '":' '{ print $2 }' | sed 's/\"//g' | sed 's/,//' | while read line; do git clone "$line"; done
Ответ 10
Я попробовал некоторые из приведенных выше команд и инструментов, но решил, что они слишком хлопотны, поэтому я написал для этого еще один инструмент командной строки, который называется github-dl
.
Чтобы использовать его (при условии, что у вас установлен nodejs)
npx github-dl -d /tmp/test wires
Это позволит получить список всех репо с wires
и записать информацию в test
каталог, используя данные авторизации (user/pass), которые вы предоставляете в CLI.
Подробно это
- Запрашивает авторизацию (поддерживает 2FA)
- Получает список репозиториев для пользователя/организации через Github API
- Есть ли для этого нумерация страниц, поэтому поддерживается более 100 репо
На самом деле он не клонирует репозитории, а вместо этого пишет файл .txt
который вы можете передать в xargs
для клонирования, например:
cd /tmp/test
cat wires-repo-urls.txt | xargs -n2 git clone
# or to pull
cat /tmp/test/wires-repo-urls.txt | xargs -n2 git pull
Может быть, это полезно для вас; это всего лишь несколько строк JS, поэтому должно быть легко приспособиться к вашим потребностям
Ответ 11
Итак, на практике, если вы хотите клонировать все репозитории из организации FOO
, которые соответствуют BAR
, вы можете использовать однострочный ниже, что требует jq и общие утилиты cli
curl 'https://api.github.com/orgs/FOO/repos?access_token=SECRET' |
jq '.[] |
.ssh_url' |
awk '/BAR/ {print "git clone " $0 " & "}' |
sh
Ответ 12
Этот однострочный python будет делать то, что вам нужно. Это:
- проверяет 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'))]"
Ответ 13
Для этого также очень полезен модуль npm. Он может не только клонировать, но и тянуть (обновить данные, которые у вас уже есть).
Вы просто создаете конфигурацию следующим образом:
[{
"username": "BoyCook",
"dir": "/Users/boycook/code/boycook",
"protocol": "ssh"
}]
и do gitall clone
, например. Или gitall pull
Ответ 14
В случае, если кто-то ищет решение для 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() }
}
Ответ 15
Я создал пип модуль для этого. Работает на Windows, Linux и OSX.
https://github.com/zeusofjuice/starclone
Можно клонировать репо с помощью:
starclone <user>
Есть несколько флагов, которые вы можете указать из файла справки или из файла README.
Ответ 16
Простое решение:
NUM_REPOS=1000
DW_FOLDER="Github_${NUM_REPOS}_repos"
mkdir ${DW_FOLDER}
cd ${DW_FOLDER}
for REPO in $(curl https://api.github.com/users/${GITHUB_USER}/repos?per_page=${NUM_REPOS} | awk '/ssh_url/{print $2}' | sed 's/^"//g' | sed 's/",$//g') ; do git clone ${REPO} ; done
Ответ 17
Вы можете получить список репозиториев с помощью 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 $2}' | sed -e 's/",//g' | sed -e 's/"//g'`
for REPO in $GIT_REPOS; do
git clone $REPO
done
Ответ 18
Вы можете использовать инструмент с открытым исходным кодом, чтобы клонировать кучу репозиториев 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
Ответ 19
Чтобы клонировать только приватные репозитории с заданным ключом доступа и установленным модулем 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;
Ответ 20
Решение Python3, которое включает в себя полное разбиение на страницы через 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 %
cat repolist | parallel -I% hub clone %
Ответ 21
Если у вас есть список репозиториев в этом списке, то этот сценарий оболочки работает:
user="https://github.com/user/"
declare -a arr=("repo1", "repo2")
for i in "${arr[@]}"
do
echo $user"$i"
git clone $user"$i"
done
Ответ 22
Если у вашей организации 100 репо, то иногда вы хотите клонировать на командном уровне для скорости. Этот инструмент поддерживает только клонирование репозиториев: https://github.com/steinfletcher/github-org-clone
Ответ 23
Я создал образец пакетного сценария. Вы можете скачать все частные/публичные репозитории с github.com. После загрузки репозитория он автоматически преобразуется в ZIP файл.
@echo off
setlocal EnableDelayedExpansion
SET "username=olyanren"
SET "password=G....."
set "mypath=%cd%\"
SET "url=https://%username%:%password%@github.com/%username%/"
FOR /F "tokens=* delims=" %%i in (files.txt) do (
SET repo=%%i
rmdir /s /q !repo!
git clone "!url!!repo!.git"
cd !repo!
echo !mypath!
git archive --format=zip -o "!mypath!!repo!.zip" HEAD
cd ..
)
Примечание: файл files.txt должен содержать только имена репозиториев, такие как:
repository1
repository2
Ответ 24
Обновление от 19 мая
используйте эту команду bash для организации (включая частное репо)
curl -u "{username}" "https://api.github.com/orgs/{org}/repos?page=1&per_page=100" | grep -o '[email protected][^"]*' | xargs -L1 git clone
Ответ 25
Преобладающие ответы здесь не учитывают, что API Github будет возвращать максимум 100 репозиториев, несмотря на то, что вы можете указать в per_page
. Если вы клонируете организацию Github с более чем 100 репозиториями, вам нужно будет перейти по ссылкам на страницы в ответе API.
Я написал CLI-инструмент для этого:
clone-github-org -o myorg
Это клонирует все репозитории в организации myorg
в текущий рабочий каталог.
Ответ 26
Другой сценарий оболочки с комментариями, который клонирует все хранилища (публичные и частные) от пользователя:
#!/bin/bash
USERNAME=INSERT_USERNAME_HERE
PASSWORD=INSERT_PASSWORD_HERE
# Generate auth header
AUTH=$(echo -n $USERNAME:$PASSWORD | base64)
# Get repository URLs
curl -iH "Authorization: Basic "$AUTH https://api.github.com/user/repos | grep -w clone_url > repos.txt
# Clean URLs (remove " and ,) and print only the second column
cat repos.txt | tr -d \"\, | awk '{print $2}' > repos_clean.txt
# Insert username:password after protocol:// to generate clone URLs
cat repos_clean.txt | sed "s/:\/\/git/:\/\/$USERNAME\:$PASSWORD\@git/g" > repos_clone.txt
while read FILE; do
git clone $FILE
done <repos_clone.txt
rm repos.txt & rm repos_clone.txt