Подтвердить что ты не робот

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

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

git clone [email protected]:company/*.git 

или подобное сработало бы, но, похоже, это не похоже на шаблон.

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

4b9b3361

Ответ 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

Ответ 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.

Подробно это

  1. Запрашивает авторизацию (поддерживает 2FA)
  2. Получает список репозиториев для пользователя/организации через Github API
  3. Есть ли для этого нумерация страниц, поэтому поддерживается более 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