Comment cloner tous les repos à la fois à partir de GitHub?

j'ai un compte GitHub d'entreprise et je veux sauvegarder tous les dépôts à l'intérieur, en comptabilisant tout ce qui pourrait être créé à des fins d'automatisation. J'espérais quelque chose comme ceci:

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

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

y a-t-il un moyen en Git de cloner puis de tout retirer en supposant que l'on a les permissions appropriées?

56
demandé sur kenorb 2013-10-25 01:12:29

19 réponses

Je ne pense pas qu'il soit possible de le faire de cette façon. Votre meilleur pari est de trouver et de passer en revue une liste des dépôts d'une organisation à l'aide de l'API.

essayez ceci:

  • créer un jeton API en allant dans les paramètres de Compte - > Applications
  • faites un appel à: http://${GITHUB_BASE_URL}/api/v3/orgs/${ORG_NAME}/repos?access_token=${ACCESS_TOKEN}
  • la réponse sera un tableau JSON d'objets. Chaque objet contiendra des informations sur l'un des dépôts. sous cette organisation. Je pense que dans votre cas, vous chercherez spécifiquement la propriété ssh_url .
  • puis git clone chacune de ces ssh_url S.

c'est un peu de travail supplémentaire, mais il est nécessaire pour GitHub d'avoir une authentification appropriée.

28
répondu Thomas Kelley 2013-10-24 21:40:51

Sur Windows et tous les UNIX/LINUX des systèmes, à l'aide de Git Bash ou tout autre Terminal , remplacer YOURUSERNAME par votre nom d'utilisateur et d'utilisation:

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éfinit CNTX=users ET NAME=yourusername, pour télécharger tous vos dépôts. Définissez CNTX=orgs et NAME = yourorgname, pour télécharger tous les dépôts de votre organisation.

la taille maximale de la page est 100, vous devez donc l'appeler plusieurs fois avec le bon numéro de page pour obtenir tous vos dépôts (mettez PAGE au numéro de page désiré que vous voulez télécharger).

voici un Shell-script à un shell-script, qui fait ce qui précède: https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e

64
répondu Erdinc Ay 2018-09-17 10:44:50

Ce gist accomplit la tâche dans 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"]} ]}'

remplacer [your_org] par le nom de votre organisation. Et réglez votre per_page si nécessaire.

mise à jour:

comme ATutorMe l'a mentionné, la taille maximale de la page est de 100, selon le GitHub docs .

Si vous avez plus de 100 repos, vous devrez ajouter un paramètre page à votre url et vous pouvez 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"]} ]}'

Note: le paramètre par défaut per_page est 30 .

18
répondu seancdavis 2017-03-11 13:33:22

dépôts D'Organisation

pour cloner toutes les repos de votre organisation, essayez le shell 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'Utilisateur

cloner tous en utilisant les URLs du dépôt Git:

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

Clonage 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 au démarrage de l'utilisateur fichiers (en utilisant curl + jq ):

# Usage: gh-clone-user (user)
gh-clone-user() {
  curl -sL "https://api.github.com/users//repos?per_page=1000" | jq -r '.[]|.clone_url' | xargs -L1 git clone
}

dépôts privés

si vous devez cloner les prises en pension privées, vous pouvez ajouter autorisation token soit dans votre en-tête comme:

-H 'Authorization: token <token>'

ou le passer dans le param ( ?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 façon est d'utiliser hub après avoir configuré votre clé API.

Cochez un autre exemple ici:


conseils:

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

- si vous devez augmenter les limites de GitHub, essayez d'authentifier en spécifiant votre clé API.

- ajouter --recursive pour revenir dans les sous-modules enregistrés, et mettre à jour tous les sous-modules imbriqués dans.

17
répondu kenorb 2018-04-27 22:19:00

allez à Paramètres de 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="<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"]} ]}'

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

merci à Arnaud pour le code de rubis.

4
répondu Cory Klein 2014-06-26 17:37:25

j'ai trouvé un commentaire dans the gist @seancdavis fourni pour être très utile, surtout parce que comme l'affiche originale, je voulais synchroniser toutes les repos pour un accès 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"]} ]}'

remplacer [[nom D'utilisateur]] par votre nom d'utilisateur github et [[organisation]] par votre organisation GitHub. La sortie (métadonnées JSON repo) sera passée à 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 <ssh_url>"
  %x[git clone #{repo["ssh_url"]} ]
end
3
répondu Garren S 2016-12-31 01:49:55

j'ai fait un script avec Python3 et Github APIv3

https://github.com/muhasturk/gitim

il suffit d'exécuter

./gitim
2
répondu muhasturk 2015-10-04 11:19:32

donc, je vais ajouter ma réponse aussi. :) (J'ai trouvé c'est simple)

Fetch list (j'ai utilisé la compagnie "magento"):

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

utilisez clone_url au lieu de ssh_url pour utiliser L'accès 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 titres privés - ajoutez simplement le paramètre GET ?access_token=YOURTOKEN

2
répondu Kirby 2016-11-03 23:36:46

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

  • vérifie github pour votre repos
  • pour chacun, fait 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/<<ORG_NAME>>/repos?per_page=200'))]"
    
1
répondu evrenesat 2015-08-11 16:20:48

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

vous venez de créer config comme ceci:

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

et do gitall clone par exemple. Ou gitall pull

1
répondu Vladislav Rastrusny 2015-11-06 14:27:07

dans le cas où quelqu'un cherche une solution Windows, voici une petite fonction dans PowerShell pour faire le tour (pourrait être oneliner/alias si ce n'est pas le fait que j'en ai besoin pour travailler à la fois 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 } 
      | % { $_.ToString() }
}
1
répondu Andrzej Lichnerowicz 2016-10-06 11:34:49

donc, dans la pratique, si vous voulez cloner toutes les repos de l'organisation FOO qui correspondent à BAR , vous pouvez utiliser la doublure ci - dessous, qui nécessite jq et les utilitaires cli communs

curl 'https://api.github.com/orgs/FOO/repos?access_token=SECRET' |
  jq '.[] |
  .ssh_url' |
  awk '/BAR/ {print "git clone " "151900920" " & "}' |
  sh
1
répondu konr 2016-12-31 01:47:42

j'ai créé un module pip pour le faire. Fonctionne sur Windows, Linux et OSX.

https://github.com/zeusofjuice/starclone

peut cloner vos pensions en utilisant:

starclone <user> 

il y a quelques options que vous pouvez spécifier à partir du fichier d'aide ou du README.

1
répondu samdixon 2018-08-27 20:21:13

vous pouvez obtenir une liste des dépôts en utilisant curl et ensuite itérer sur ladite liste avec une boucle de 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 }' | sed -e 's/",//g' | sed -e 's/"//g'`
for REPO in $GIT_REPOS; do
  git clone $REPO
done
0
répondu Sriram Mageswaran 2016-09-20 16:13:12

vous pouvez utiliser un outil open-source pour cloner un tas de dépôts 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

0
répondu A.N. 2017-08-20 12:09:45

pour cloner uniquement les repos privés, avec une clé d'accès, et avec le module Python 3 et requests installé:

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
répondu ubugnu 2018-03-21 15:58:01
curl -s https://api.github.com/orgs/[GITHUBORG_NAME]/repos | grep clone_url | awk -F '":' '{ print  }' | sed 's/\"//g' | sed 's/,//' | while read line; do git clone "$line"; done
0
répondu julianzhang 2018-04-23 11:16:03

une solution Python3 qui inclut une pagination exhaustive via L'en-tête Link .

prérequis:


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

alors, vous pouvez utiliser xargs ou parallèle et cat repolist | parallel -I% hub clone %

0
répondu Jose Alban 2018-06-08 16:00:28

si vous avez la liste des dépôts 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 
0
répondu Kasthuri Shravankumar 2018-07-16 14:42:38