tag repositorio remote crear git github git-clone

repositorio - git pull



¿Cómo clonar todos los repos a la vez desde GitHub? (18)

Repositorios de organización

Para clonar todos los repos de su organización, pruebe el siguiente shell one-liner:

GHORG=company; curl "https://api.github.com/orgs/$GHORG/repos?per_page=1000" | grep -o ''git@[^"]*'' | xargs -L1 git clone

Repositorios de usuario

Clonación de todas las URL de repositorio de Git:

GHUSER=CHANGEME; curl "https://api.github.com/users/$GHUSER/repos?per_page=1000" | grep -o ''git@[^"]*'' | xargs -L1 git clone

Clonación de todos usando Clonar 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

Aquí está la útil función de shell que se puede agregar a los archivos de inicio del usuario (usando 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 }

Repositorios privados

Si necesita clonar los repos privados, puede agregar un token de Autorización en su encabezado como:

-H ''Authorization: token <token>''

o páselo en el ?access_token=TOKEN ( ?access_token=TOKEN ), por ejemplo:

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

Otra forma es usar hub después de configurar su clave API.

Ver otro ejemplo aquí:

  • Cómo descargar GitHub Release de repo privado usando la línea de comando .

Sugerencias:

- Para aumentar la velocidad, configure el número de procesos paralelos especificando el parámetro -P para xargs ( -P4 = 4 procesos).

- Si necesita aumentar los límites de GitHub, intente autenticar especificando su clave de API.

- Agregar --recursive a recurse en los submódulos registrados, y actualizar cualquier submódulo anidado dentro.

Tengo una cuenta de GitHub de la compañía y quiero hacer una copia de seguridad de todos los repositorios, teniendo en cuenta cualquier cosa nueva que pueda crearse para fines de automatización. Esperaba algo como esto:

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

o similar funcionaría, pero no parece gustarle el comodín allí.

¿Hay alguna manera en Git de clonar y luego extraer todo suponiendo que uno tiene los permisos adecuados?


En Windows y en todos los sistemas UNIX / LINUX , usando Git Bash o cualquier otro Terminal , reemplace YOURUSERNAME por su nombre de usuario y use:

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

Establezca CNTX = usuarios y NAME = su nombre de usuario, para descargar todos sus repositorios. Establezca CNTX = org y NAME = yourorgname, para descargar todos los repositorios de su organización.

El tamaño máximo de página es 100, por lo que debe llamar a esto varias veces con el número de página correcto para obtener todos sus repositorios (configure PAGE en el número de página que desee descargar).


En caso de que alguien busque una solución de Windows, aquí hay una pequeña función en PowerShell para hacer el truco (podría ser oneliner / alias si no fuera por el hecho de que necesito que funcione tanto con proxy como sin él).

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() } }


Encontré un comentario en el sitio web @seancdavis, que fue muy útil, especialmente porque, como el póster original, quería sincronizar todos los repos para un acceso rápido, sin embargo, la gran mayoría eran privados.

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"]} ]}''

Reemplace [[NOMBRE DE USUARIO]] con su nombre de usuario github y [[ORGANIZACIÓN]] con su organización de Github. El resultado (metadatos de repositorio JSON) se pasará a un simple script de 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


Entonces, agregaré mi respuesta también. :) (Encontré que es simple)

Fetch list (he usado la compañía "magento"):

curl -si https://api.github.com/users/magento/repos | grep ssh_url | cut -d ''"'' -f4

Utilice clone_url en clone_url lugar ssh_url para usar el acceso HTTP.

Entonces, ¡clonémoslos todos! :)

curl -si https://api.github.com/users/magento/repos | / grep ssh_url | cut -d ''"'' -f4 | xargs -i git clone {}

Si va a buscar repositorios privados, simplemente agregue el parámetro GET ?access_token=YOURTOKEN


Este pitón de una sola línea hará lo que necesites. Eso:

  • comprueba github para ver los repos disponibles
  • para cada uno, realiza una llamada al sistema para 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''))]"



No creo que sea posible hacerlo de esa manera. Su mejor opción es buscar y recorrer una lista de repositorios de una organización utilizando la API.

Prueba esto:

  • Crea un token de API yendo a Configuración de cuenta -> Aplicaciones
  • Realice una llamada a: http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
  • La respuesta será una matriz de objetos JSON. Cada objeto incluirá información sobre uno de los repositorios bajo esa Organización. Creo que en su caso, ssh_url específicamente la propiedad ssh_url .
  • Luego git clone cada uno de esos ssh_url s.

Es un poco de trabajo extra, pero es necesario que GitHub tenga la autenticación adecuada.


Para clonar solo repositorios privados, dada una clave de acceso, y dado python 3 y el módulo de solicitudes instalado:

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;


Por lo tanto, en la práctica, si desea clonar todos los repos de la organización FOO que coinciden con BAR , podría usar el de una línea a continuación, que requiere jq y utilidades cli comunes.

curl ''https://api.github.com/orgs/FOO/repos?access_token=SECRET'' | jq ''.[] | .ssh_url'' | awk ''/BAR/ {print "git clone " $0 " & "}'' | sh


Puede obtener una lista de repositorios usando curl y luego iterar sobre dicha lista con un bucle 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



Si tiene una lista de repositorios en una lista como esta, entonces este script de shell funciona:

user="https://github.com/user/" declare -a arr=("repo1", "repo2") for i in "${arr[@]}" do echo $user"$i" git clone $user"$i" done


También hay un módulo npm muy útil para hacer esto. No solo puede clonar, sino también extraer (para actualizar los datos que ya tiene).

Usted acaba de crear una configuración como esta:

[{ "username": "BoyCook", "dir": "/Users/boycook/code/boycook", "protocol": "ssh" }]

y hacer gitall clone por ejemplo. O gitall pull


Una solución de Python3 que incluye una paginación exhaustiva a través del encabezado del Link .

Prerrequisitos:

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])

Entonces, puedes usar xargs o parallel y: cat repolist | parallel -I% hub clone % cat repolist | parallel -I% hub clone %


Vaya a Configuración de cuenta -> Aplicación y cree una clave de API
A continuación, inserte la clave de la API, la URL de la instancia de github y el nombre de la organización en el siguiente script

#!/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"]} ]}''

Guárdelo en un archivo, chmod u+x el archivo, luego ejecútelo.

Gracias a Arnaud por el código de rubí.


Esta esencia realiza la tarea en una línea en la línea de comando:

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"]} ]}''

Reemplace [your_org] con el nombre de su organización. Y establece tu per_page si es necesario.

ACTUALIZAR:

Como mencionó ATutorMe, el tamaño máximo de página es 100, según los documentos de GitHub .

Si tiene más de 100 repositorios, tendrá que agregar un parámetro de page a su url y podrá ejecutar el comando para cada página.

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"]} ]}''

Nota: El parámetro por per_page predeterminado es 30 .


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