GitLab Python Clona Todo con Estructura
Quiero clonar todos los proyectos en mi entorno de GitLab. Hay varios grupos y subgrupos con sus propios proyectos. Me gustaría clonar los proyectos manteniendo la estructura de los grupos localmente. Por ejemplo:
Grupo1
Subgrupo1
Proyecto1
Grupo2
Proyecto1
Grupo3
Subgrupo1
Proyecto1
Subgrupo2
Proyecto1
Proyecto2
Entonces, si ejecuto cd Grupo3/Subgrupo2/Proyecto2
localmente, estaría en el código correspondiente a ese proyecto.
Mi código hace parte del trabajo pero falla en los subgrupos:
“`import gitlab
import os
from git import Repo
TOKEN_GITLAB = os.getenv('TOKEN_GITLAB')
gl = gitlab.Gitlab(url='https://gitlab.example.priv', private_token=TOKEN_GITLAB)
todos_grupos = gl.groups.list(all=True, top_level_only=True)
conteo = 0
for grupo in todos_grupos:
os.chdir('/Users/ken/repos')
print("—————- {} —————-".format(grupo.full_path))
if not os.path.exists(grupo.full_path):
print("\tCreando directorio para el grupo " + grupo.full_path)
os.makedirs(grupo.full_path)
os.chdir(grupo.full_path)
print("Clonando proyectos para el grupo " + grupo.full_path)
for proyecto in grupo.projects.list(all=True):
if not os.path.exists(proyecto.path):
Repo.clone_from(proyecto.ssh_url_to_repo, proyecto.path)
print("Creando directorios para los subgrupos")
subgrupos = grupo.subgroups.list()
for subgrupo in subgrupos:
if not os.path.exists(subgrupo.full_path):
os.makedirs(subgrupo.full_path)
os.chdir(subgrupo.full_path)
print("Clonando proyectos para el subgrupo " + subgrupo.full_path)
group = gl.groups.get(subgrupo.id, lazy=True)
for proyecto in group.projects.list(all=True):
Repo.clone_from(proyecto.ssh_url_to_repo, proyecto.path)
os.chdir('..')
“`
¿Cómo puedo iterar sobre grupos y subgrupos para clonar todos los proyectos manteniendo la estructura de carpetas localmente?
davy.ai
Para iterar sobre grupos y subgrupos y clonar todos los proyectos manteniendo la estructura de carpetas localmente, puedes utilizar llamadas recursivas a la función para listar todos los subgrupos y sus proyectos. Aquí tienes un fragmento de código actualizado:
Este código define una función llamada
clone_projects
que toma un grupo y una ruta base como entradas. La función cambia el directorio de trabajo actual a la ruta base y clona todos los proyectos del grupo actual.Luego, la función lista todos los subgrupos del grupo actual, crea un directorio para cada subgrupo y llama recursivamente a
clone_projects
para cada subgrupo.El programa principal itera sobre todos los grupos de nivel superior, crea un directorio para cada grupo y llama a
clone_projects
para cada grupo con el grupo y la ruta del grupo como entradas.Este enfoque debería clonar todos los proyectos manteniendo la estructura de los grupos de forma local.