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''))]"
Hice una secuencia de comandos con Python3 y Github APIv3
https://github.com/muhasturk/gitim
Solo corre
./gitim
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 propiedadssh_url
. - Luego
git clone
cada uno de esosssh_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
Puede usar la herramienta de código abierto para clonar un montón de repositorios de github: https://github.com/artiomn/git_cloner
Ejemplo:
git_cloner --type github --owner octocat --login user --password user https://my_bitbucket
Use la API JSON de api.github.com
. Puede ver el ejemplo de código en la documentación de github: https://developer.github.com/v3/
O ahi:
https://github.com/artiomn/git_cloner/blob/master/src/git_cloner/github.py
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:
- API de Github "Ficha de acceso personal"
-
pip3 install links-from-link-header
- hub
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