Cloner tous les repos d’une organisation sur Github

Je cherchais un moyen rapide de cloner tous les repos publics d’une organisation sur Github. D’autres se sont bien sûr posés la question mais les solutions proposées m’ont toutes semblées trop complexes / tordues.

Résultat, j’ai fait la mienne :

bash -x <(curl -s "https://api.github.com/orgs/alphagov/repos" | jq -r '.[].git_url | "git clone " + sub("git://"; "https://")')

L’organisation est ici alphagov, à remplacer évidemment.

Il y a trois étapes :

  1. curl -s "https://api.github.com/orgs/alphagov/repos" récupère la liste des repos de l’organisation au format JSON. Il y a pas mal d’informations dedans (toutes les URLs, nombre de forks, de watchers, etc.).
  2. On passe à jq, un outil (très puissant) en ligne de commande pour parser du JSON qui a son propre langage.
    1. .[].git_url indique de conserver uniquement l’URL du repo. Ce qui donne :
      $ curl -s "https://api.github.com/orgs/alphagov/repos" | jq -r '.[].git_url'
      git://github.com/alphagov/static.git
      git://github.com/alphagov/slimmer.git
      (...)
      
    2. sub("git://"; "https://") permet ainsi de remplacer les git:// par des https:// car je ne suis pas authentifié sur Github. Ce qui donne :
      $ curl -s "https://api.github.com/orgs/alphagov/repos" | jq -r '.[].git_url | "git clone " + sub("git://"; "https://")'
      git clone https://github.com/alphagov/static.git
      git clone https://github.com/alphagov/slimmer.git
      (...)
      
  3. Le tout est envoyé en entrée à bash qui va exécuter les commandes et cloner tous les répertoires !

Bonus : Pourquoi alphagov ? Car c’est une très bonne source d’inspiration tant en Ruby (la plupart sont des applications Rails) qu’en Puppet et en Terraform (ici et ici).