¿Cómo clonar todos los repositorios a la vez desde GitHub?


97

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

git clone git@github.com:company/*.git 

o similar funcionaría, pero no parece que le guste el comodín allí.

¿Hay alguna forma en Git de clonar y luego extraer todo asumiendo que uno tiene los permisos apropiados?


2
Buena pregunta. ¿Y qué tal mantenerlos sincronizados mediante pull? ¿Alguna de las respuestas funciona para los tirones?
nealmcb

Necesitamos una solución de Python, para aquellos de nosotros que no somos tan expertos en node o ruby;) O github debería leer esto y tener piedad de nosotros y simplemente proporcionar una interfaz web simple para esto ...
nealmcb

Respuestas:


52

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

Prueba esto:

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

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


Creé el token de API y obtengo el resultado de la llamada, pero no veo nada que haga referencia a lo que sé de nuestros repositorios o la cadena 'ssh_url'. Sospecho que no hice la llamada correctamente. curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>
numb3rs1x

¿Es esta una cuenta de GitHub Enterprise o github.com?
Thomas Kelley

1
Ah, te entendí mal. Pensé que era una cuenta Enterprise. En lugar de https://github.com/api/v3/intentarlo https://api.github.com/.
Thomas Kelley

1
Y no estoy seguro de cómo está configurada su empresa en particular, pero si es un "usuario" en lugar de una "organización", entonces querrá usar la /users/${COMPANY}/reposruta en lugar de /orgs/${COMPANY}/repos.
Thomas Kelley

1
Por GitHub: utilice el encabezado HTTP Autorización en su lugar, ya que el uso del access_tokenparámetro de consulta está obsoleto. Si este token lo está utilizando una aplicación sobre la que no tiene control, tenga en cuenta que puede dejar de funcionar como resultado de esta desaprobación.
BogeyMan

114

En Windows y todos los sistemas UNIX / LINUX , usando Git Bash o cualquier otra Terminal , reemplace YOURUSERNAMEpor 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
  • Configure CNTX=usersy NAME=yourusername, para descargar todos sus repositorios.
  • Configure CNTX=orgsy 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 (establezca PAGEel número de página deseado que desea descargar).

Aquí hay un script de shell que hace lo anterior: https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e


4
Solución bash pura, la más sencilla. Para su información, este código bash se puede ejecutar en casi cualquier entorno * nix, Linux, Cygwin, Mingw y, por supuesto, Gitbash, que en realidad es una emulación de terminal como otras.
m3nda

1
Esto no funciona con las organizaciones, por lo que no responde directamente a la pregunta. Esta respuesta de Kenorb maneja organizaciones y también funciona para hasta 1000 repositorios, funcionó mejor para mí.
RichVel

1
con autenticación: curl " api.github.com/$CNTX/$NAME/… " | grep -e 'git_url *' | cut -d \ "-f 4 | xargs -L1 clon de git
Yannick Wurm

2
Actualice la respuesta (febrero de 2019): de acuerdo con GitHub API v3, su curl debe ir a / orgs / ORGNAME / repos. También puede incluir un enlace a la API v3: developer.github.com/v3. También para repositorios privados necesitaría agregar curl -u "nombre de usuario", luego curl le pedirá la contraseña una vez. De lo contrario, funciona muy bien.
:)

1
ACTUALIZACIÓN del comentario de dimitry hevkoplyas stackoverflow.com/questions/19576742/… . developer.github.com/v3 devuelve el estado 301 cuando intenta curl. use este comando bash curl -u "{username}" " api.github.com/orgs {org} / repos? page = 1 & per_page = 100" | grep -o 'git @ [^ "] *' | xargs -L1 git clone funciona al 100%
Tommy

43

Repositorios de organizaciones

Para clonar todos los repositorios de su organización, pruebe la siguiente línea de shell:

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

Repositorios de usuarios

Clonando todo usando las URL del repositorio de Git:

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

Clonando todo 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 función de shell útil 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 repositorios privados, puede agregar el token de autorización en su encabezado como:

-H 'Authorization: token <token>'

o pasarlo en el param ( ?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

Notas:

  • Para obtener solo repositorios privados, agréguelo type=privatea su cadena de consulta.
  • Otra forma es usarlo hubdespués de configurar su clave API.

Ver también:


Sugerencias :
- Para aumentar la velocidad, establezca el número de procesos paralelos especificando el -Pparámetro para xargs( -P4= 4 procesos).
- Si necesita aumentar los límites de GitHub, intente autenticarse especificando su clave de API.
- Agregue --recursivea recurse en los submódulos registrados y actualice los submódulos anidados dentro.


2
per_page = 1000 alcanza un máximo de 100
aehlke

20

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

Reemplácelo [your_org]con el nombre de su organización. Y configura tuper_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 pageparámetro a su URL y puede 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 per_pageparámetro predeterminado es 30.


¿Alguna idea de cómo se hace esto para los repositorios privados a los que tiene acceso?
MichaelGofron

el segundo no funciona porque el ampersand lo hace pasar a una tarea en segundo plano
slashdottir

Agregué & access_token = <my_access_token> a la URL y funcionó perfectamente
rmartinus

2do: página = 1 (!)
Yannick Wurm

5

Vaya a Configuración de la cuenta -> Aplicación y cree una clave de API
Luego inserte la clave de 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+xel archivo, luego ejecútelo.

Gracias a Arnaud por el código ruby.


5

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

Obtener lista (he utilizado la empresa "magento"):

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

Utilizar en su clone_urllugarssh_url para utilizar 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 obtener repositorios privados, simplemente agregue el parámetro GET ?access_token=YOURTOKEN


1
Sí, no se necesita rubí, solo grepping ...
Xiao-Feng Li

4

Encontré un comentario en la esencia que @seancdavis proporcionó para ser muy útil, especialmente porque, al igual que el póster original, quería sincronizar todos los repositorios para un acceso rápido, sin embargo, la gran mayoría de los cuales 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"]} ]}'

Reemplaza [[USERNAME]] con tu nombre de usuario de github y [[ORGANIZATION]] con tu organización de Github. La salida (metadatos del repositorio JSON) se pasará a un script ruby ​​simple:

# 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

1
Esta solución funcionó perfectamente para mí. En realidad, todo lo que necesitaba era clonar todos los repositorios de mi cuenta personal en mi nueva máquina local. Muy útil para configurar una nueva estación de trabajo. Nota: para hacer esto tuve que cambiarme .../orgs/[[organization]]/repos...a .../users/[[username]]/repos.... Ahora puedo importar rápidamente todo mi trabajo a diferentes máquinas locales. ¡GRACIAS!
B. Bulpett


2

Este one-liner de Python hará lo que necesita. Eso:

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

2
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

2
Agregue una explicación a su solución. De esa manera, otras personas con problemas similares podrán comprender su solución más fácilmente.
Nander Speerstra

Un detalle es que se necesita un número de página de paso como ?page=2.
Bruno Wego

2

Solución simple:

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

2

Probé algunos de los comandos y herramientas anteriores, pero decidí que eran demasiado molestos, así que escribí otra herramienta de línea de comandos para hacer esto, llamada github-dl.

Para usarlo (asumiendo que tiene nodejs instalado)

npx github-dl -d /tmp/test wires

Esto obtendría una lista de todos los repositorios de wiresy escribiría información en el testdirectorio, utilizando los detalles de autorización (usuario / contraseña) que proporcionas en la CLI.

En detalle,

  1. Solicita la autenticación (admite 2FA)
  2. Obtiene una lista de repositorios para el usuario / organización a través de la API de Github
  3. Hace paginación para esto, por lo que se admiten más de 100 repositorios

En realidad, no clona los repositorios, sino que escribe un .txtarchivo al que puede pasar xargspara hacer la clonación, por ejemplo:

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

Quizás esto sea útil para ti; son solo unas pocas líneas de JS, por lo que debería ser fácil de ajustar a sus necesidades


1

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

Simplemente crea una configuración como esta:

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

y hazlo gitall clonepor ejemplo. Ogitall pull


1

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 un delineador / alias si no es el hecho de que necesito que funcione con y sin proxy).

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

1

Entonces, en la práctica, si desea clonar todos los repositorios de la organización FOOque coinciden BAR, puede usar el siguiente esquema, 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

1

Otro script de shell con comentarios que clona todos los repositorios (públicos y privados) de un usuario:

#!/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

1

Cree un alias / func de bash en su ~/.bashrc file

Resolví esto para mi equipo creando un alias / bash func en mi ~/.bashrc file

pasos

abra una terminal o shell de Linux y abra su ~/.bashrc file:

sudo nano ~/.bashrc

agregue esta función:

CloneAll() {
    # Make the url to the input github organization's repository page.
    ORG_URL="https://api.github.com/orgs/${1}/repos?per_page=200";

    # List of all repositories of that organization (seperated by newline-eol).
    ALL_REPOS=$(curl -s ${ORG_URL} | grep html_url | awk 'NR%2 == 0' \
                | cut -d ':' -f 2-3 | tr -d '",');

    # Clone all the repositories.
    for ORG_REPO in ${ALL_REPOS}; do
        git clone ${ORG_REPO}.git;
    done
}

guarde y cierre su archivo ~ / .bashrc y luego cierre la terminal; debe hacer esto o la nueva función no se inicializará:

abre una nueva terminal y pruébalo:

CloneAll <your_github_org_name>

ejemplo : si la URL de su repositorio de github personal se llama https://github.com/awesome-async, el comando sería

CloneAll awesome-async

Importante

el per_page=200al final de la primera variable ORG_URLestablece el número de pases que serán clonados, así que presta especial atención a lo siguiente:

ORG_URL="https://api.github.com/orgs/${1}/repos?per_page=200";  <---- make sure this is what you want

¡Espero que esto ayude! :)


Parece max. el valor para per_page es 100 ... para organizaciones grandes se agregó el número de página como segundo parámetro y funciona perfectamente para mis necesidades...repos?page=${2}&per_page=100";
sv3n

0

Puede obtener una lista de los repositorios usando curly luego iterar sobre dicha lista con un ciclo 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


0

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;

0

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

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

Luego, puede usar xargso paralelo y:cat repolist | parallel -I% hub clone %


0

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 

si hay algunos repositorios privados, puede actualizar "usuario" de esta manera: usuario = " usuario: contraseña@github.com/user "
Med Ali Difallah

0

Creé un script por lotes de muestra. Puede descargar todos los repositorios privados / públicos de github.com. Una vez que se descarga un repositorio, se convierte automáticamente en un archivo 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 ..
)

Nota: el archivo files.txt debe contener solo nombres de repositorio como:

repository1
repository2

0

Actualización del 19 de mayo

use este comando bash para una organización (repositorio privado incluido)

curl -u "{username}" "https://api.github.com/orgs/{org}/repos?page=1&per_page=100" | grep -o 'git@[^"]*' | xargs -L1 git clone

0

Las respuestas predominantes aquí no tienen en cuenta que la API de Github solo devolverá un máximo de 100 repositorios a pesar de lo que pueda especificar en per_page . Si está clonando una organización de Github con más de 100 repositorios, deberá seguir los enlaces de paginación en la respuesta de la API.

Escribí una herramienta CLI para hacer precisamente eso :

clone-github-org -o myorg

Esto clonará todos los repositorios de la myorgorganización en el directorio de trabajo actual.


0

Para organizaciones a las que tiene acceso con repositorios privados:

curl -u <YOUR_GITHUB_USERNAME> -s https://api.github.com/orgs/<ORG_NAME>/repos?per_page=200 | ruby -rubygems -e ’require “json”; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo[“html_url”]} ]}'

Utiliza el html_url, por lo que no es necesario que access_tokeningrese su contraseña de github cuando se le solicite.


La autenticación básica que usa una contraseña para la API está obsoleta y pronto dejará de funcionar. Visite [deprecating-password-auth] ( developer.github.com/changes/… ) para obtener más información sobre las soluciones alternativas sugeridas y las fechas de eliminación.
BogeyMan

@BogeyMan ¡gracias por la actualización!
Flavio

0

Clona todos tus repositorios que no sean bifurcaciones:

curl -u "username" https://api.github.com/user/repos\?page\=1\&per_page\=100 |
  jq -r 'map(select(.fork == false)) | .[] | .ssh_url' |
  xargs -L1 git clone

Clona tus gists:

curl https://api.github.com/users/username/gists\?page\=1\&per_page\=100 |
   jq -r ".[] | .git_pull_url +\" '\" + (.files|keys|join(\"__\") + \"'\")" |
   xargs -L1 git clone

Este jqcomando es complejo porque el nombre del repositorio de gists es hash, por lo que el comando concatena todos los nombres de archivo para que sean el nombre del repositorio


Puede filtrar el JSON arbitrariamente usando jq

Instalar en pc: sudo apt-get install jq

En el ejemplo anterior, filtré las bifurcaciones usando esto: curl ... | jq -r 'map(select(.fork == false))' ...- útil para no clonar repositorios donde ha realizado solicitudes de extracción casuales

jq admite algunas funciones muy avanzadas. man jqes tu amigo


Puede autenticarse con curl -u "username" ... para acceder a repositorios privados


URL de la API de Guthub

  • Sus repositorios (necesita autenticación): https://api.github.com/user/repos\?page\=1\&per_page\=100
  • Cualquier usuario: https://api.github.com/users/other_username/repos\?page\=1\&per_page\=100
  • Organizaciones: https://api.github.com/orgs/orgname/repos\?page\=1\&per_page\=100

Documentos de API de Github para repositorios


0
"""
Clone all public Github Repos

https://developer.github.com/v3/repos/#list-repositories-for-a-user
"""

import urllib.request, base64
import json
import os


def get_urls(username):
    url = f"https://api.github.com/users/{username}/repos?per_page=200"
    request = urllib.request.Request(url)
    result = urllib.request.urlopen(request)
    return json.load(result)


if __name__ == "__main__":
    for r in get_urls("MartinThoma"):
        if not os.path.isdir(r["name"]):
            print(f"Clone {r['name']}...")
            os.system("git clone " + r["ssh_url"])
        else:
            print(f"SKIP {r['name']}...")

0

Para clonar todos sus repositorios privados y públicos, simplemente genere un nuevo token de acceso con acceso a repositorios y use esto:

(reemplácelo con su propio token de acceso y nombre de usuario)

for line in $(curl https://api.github.com/user/repos?access_token=ACCESS_TOKEN_HERE  | grep -o "git@github.com:YOUR_USER_NAME/[^ ,\"]\+");do git clone $line;done

Esto clonará todos los repositorios en la carpeta actual

Este es un pequeño programa bash, puedes pegarlo en la terminal y presionar enter

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.