Cloner tous les dépôts d’un groupe Gitlab

Today I learned (TIL)

À ma grande surprise, j’ai découvert qu’il n’existe pas de fonctionnalité sur Gitlab pour exporter rapidement tous ses projets.

À la pénible perspective d’avoir à traiter des centaines de dépôts à la main, j’ai cherché s’il n’y avait pas une solution technique efficace ET suffisamment simple pour que je la prenne en main.

J’ai trouvé une piste sur Stackoverflow pour me faciliter un peu le travail.

for repo in $(curl -s --header "PRIVATE-TOKEN: <your_private_token>" https://gitlab.com/api/v4/groups/<group_id> | jq -r ".projects[].ssh_url_to_repo"); do git clone $repo; done;

Prérequis

Le script fonctionne uniquement avec un shell bash1 et nécessite au préalable d’avoir curl (installé par défaut sur macOS) et jq.

Il est également nécessaire de générer un jeton d’accès privé (private token) en allant sur la page Personal Access Token. Ne sachant pas quels droits donner, j’ai coché toutes les options.

Fonctionnement

  1. Remplacer <your_private_token> par le jeton d'accès privé et <group_id> par l'ID du groupe.
  2. Lancer le script dans un shell bash à l’endroit où vous voulez télécharger les projets.

Limites connues et éléments à creuser

  • Impossibilité de télécharger les projets archivés d’un groupe.
  • Les projets situés dans les sous-groupes ne sont pas téléchargés même si on ajoute include_subgroups=true.
  • Il semble y avoir une limite à 100 projets.

Le code suivant pourrait mieux fonctionner pour les sous-groupes, mais je ne l’ai pas encore testé :

for repo in $(curl -s --header "PRIVATE-TOKEN: <your_private_token>" https://gitlab.com/api/v4/groups/<group-id>/projects\?include_subgroups\=true | jq ".[].ssh_url_to_repo" | tr -d '"'); do git clone $repo; done;


  1. cf. Terminal : de zsh à bash pour passer sur un shell bash. ↩︎

Contact

Vous souhaitez réagir ? N’hésitez pas à m’écrire à contact@luce.carevic.eu.