Comment cloner tous les repositorys à la fois sur GitHub?

J’ai un compte d’entreprise GitHub et je veux sauvegarder tous les référentiels, en tenant compte de tout ce qui pourrait être créé à des fins d’automatisation. J’espérais quelque chose comme ça:

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

ou similaire fonctionnerait, mais il ne semble pas aimer le joker.

Existe-t-il un moyen dans Git de cloner puis de retirer tout en supposant que l’on dispose des permissions appropriées?

Je ne pense pas qu’il soit possible de le faire de cette façon. Votre meilleur pari est de rechercher et de parcourir une liste des référentiels d’une organisation à l’aide de l’API.

Essaye ça:

  • Créez un jeton API en allant dans Paramètres du compte -> Applications
  • Appelez: http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
  • La réponse sera un tableau d’objects JSON. Chaque object comprendra des informations sur l’un des référentiels de cette organisation. Je pense que dans votre cas, vous chercherez spécifiquement la propriété ssh_url .
  • Ensuite, git clone chacun de ces ssh_url s.

C’est un peu de travail supplémentaire, mais GitHub doit avoir une authentification correcte.

Sous Windows et tous les systèmes UNIX / LINUX , en utilisant Git Bash ou tout autre terminal , remplacez YOURUSERNAME par votre nom d’utilisateur et utilisez:

 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 

Définissez CNTX = users et NAME = yourusername, pour télécharger tous vos référentiels. Définissez CNTX = orgs et NAME = yourorgname pour télécharger tous les référentiels de votre organisation.

La taille maximale de la page est 100, vous devez donc appeler plusieurs fois avec le bon numéro de page pour obtenir tous vos référentiels (définissez PAGE sur le numéro de page que vous souhaitez télécharger).

Cet élément accomplit la tâche en une ligne sur la ligne de commande:

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

Remplacez [your_org] par le nom de votre organisation. Et définissez votre per_page si nécessaire.

METTRE À JOUR:

Selon ATutorMe, la taille maximale de la page est de 100, selon les documents GitHub .

Si vous avez plus de 100 mises en pension, vous devrez append un paramètre de page à votre URL et exécuter la commande pour chaque page.

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

Remarque: Le paramètre par défaut per_page est 30 .

Référentiels d’organisation

Pour cloner tous les repositorys de votre organisation, essayez le one-liner suivant:

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

Référentiels d’utilisateurs

Cloner tout en utilisant les URL du référentiel Git:

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

Cloner tout en utilisant l’URL du clone:

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

Voici la fonction shell utile qui peut être ajoutée aux fichiers de démarrage de l’utilisateur (en utilisant 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 } 

Référentiels privés

Si vous devez cloner les repos privés, vous pouvez append un jeton d’autorisation dans votre en-tête comme suit:

 -H 'Authorization: token ' 

ou le passer dans le ?access_token=TOKEN ( ?access_token=TOKEN ), par exemple:

 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 

Une autre méthode consiste à utiliser le hub après avoir configuré votre clé API.

Vérifiez un autre exemple ici:

  • Comment télécharger GitHub Release depuis repo privé en utilisant la ligne de commande .

Astuces:

– Pour augmenter la vitesse, définissez le nombre de processus parallèles en spécifiant le paramètre -P pour xargs ( -P4 = 4 processus).

– Si vous devez augmenter les limites GitHub, essayez de vous authentifier en spécifiant votre clé API.

– Ajouter --recursive pour --recursive dans les sous-modules enregistrés et mettre à jour tous les sous-modules nesteds.

Accédez à Paramètres du compte -> Application et créez une clé API.
Ensuite, insérez la clé API, l’URL de l’instance github et le nom de l’organisation dans le script ci-dessous.

 #!/bin/bash # Substitute variables here ORG_NAME="" ACCESS_TOKEN="" 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"]} ]}' 

Enregistrez-le dans un fichier, chmod u+x le fichier, puis exécutez-le.

Merci à Arnaud pour le code Ruby.

J’ai trouvé un commentaire dans gist @seancdavis fourni très utile, surtout parce que, comme l’affiche originale, je voulais synchroniser tous les repos pour un access rapide, mais la grande majorité d’entre eux étaient privés.

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

Remplacez [[NOM D’UTILISATEUR]] par votre nom d’utilisateur github et [[ORGANISATION]] par votre organisation Github. La sortie (métadonnées repo JSON) sera transmise à un simple script 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 " %x[git clone #{repo["ssh_url"]} ] end 

J’ai fait un script avec Python3 et Github APIv3

https://github.com/muhasturk/gitim

Juste courir

 ./gitim 

Donc, j’appendai aussi ma réponse. 🙂 (j’ai trouvé c’est simple)

Fetch list (j’ai utilisé la société “magento”):

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

Utilisez plutôt ssh_url pour utiliser l’access HTTP.

Alors, clonons-les tous! 🙂

 curl -si https://api.github.com/users/magento/repos | \ grep ssh_url | cut -d '"' -f4 | xargs -i git clone {} 

Si vous allez chercher des repo privés – ajoutez simplement le paramètre GET ?access_token=YOURTOKEN

Ce one-liner Python fera ce dont vous avez besoin. Il:

  • chèques github pour vos pensions disponibles
  • pour chacun, lance un appel système à 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/<>/repos?per_page=200'))]" 

Il existe également un module npm très utile pour ce faire. Il peut non seulement cloner, mais aussi tirer (pour mettre à jour les données que vous avez déjà).

Vous venez de créer la configuration comme ceci:

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

et faire gitall clone par exemple. Ou gitall pull

Au cas où quelqu’un chercherait une solution Windows, voici une petite fonction de PowerShell (faire un onininer / alias si ce n’est le fait que j’en ai besoin pour travailler avec et sans 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 } | % { $_.ToSsortingng() } } 

Donc, en pratique, si vous voulez cloner toutes les mises en pension de l’organisation FOO qui correspondent à BAR , vous pouvez utiliser la ligne unique ci-dessous, qui nécessite des utilitaires jq et cli

 curl 'https://api.github.com/orgs/FOO/repos?access_token=SECRET' | jq '.[] | .ssh_url' | awk '/BAR/ {print "git clone " $0 " & "}' | sh 

J’ai créé un module pip pour ce faire. Fonctionne sous Windows, Linux et OSX.

https://github.com/zeusofjuice/starclone

Peut cloner vos repo en utilisant:

 starclone  

Vous pouvez spécifier quelques indicateurs à partir du fichier d’aide ou du fichier README.

Vous pouvez obtenir une liste des référentiels en utilisant curl , puis parcourir cette liste avec une boucle 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 

Vous pouvez utiliser l’outil open-source pour cloner des repositorys github: https://github.com/artiomn/git_cloner

Exemple:

git_cloner --type github --owner octocat --login user --password user https://my_bitbucket

Utilisez l’API JSON de api.github.com . Vous pouvez voir l’exemple de code dans la documentation github: https://developer.github.com/v3/

Ou là:

https://github.com/artiomn/git_cloner/blob/master/src/git_cloner/github.py

Pour cloner uniquement les repos privés, avec une clé d’access, et si python 3 et le module de requêtes sont installés:

 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; 
 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 

Une solution Python3 qui inclut une pagination exhaustive via l’en-tête de Link .

Conditions préalables:

  • API Github “Jeton d’access personnel”
  • pip3 install links-from-link-header
  • centre

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

Ensuite, vous pouvez utiliser xargs ou parallel et: cat repolist | parallel -I% hub clone % cat repolist | parallel -I% hub clone %

Si vous avez une liste de référentiels dans une liste comme celle-ci, alors ce script shell fonctionne:

 user="https://github.com/user/" declare -a arr=("repo1", "repo2") for i in "${arr[@]}" do echo $user"$i" git clone $user"$i" done