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?
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 cesssh_url
S.
c'est un peu de travail supplémentaire, mais il est nécessaire pour GitHub d'avoir une authentification appropriée.
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
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
.
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.
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.
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
j'ai fait un script avec Python3 et Github APIv3
https://github.com/muhasturk/gitim
il suffit d'exécuter
./gitim
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
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'))]"
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
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() }
}
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
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.
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
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
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;
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
une solution Python3 qui inclut une pagination exhaustive via L'en-tête Link
.
prérequis:
- Github API Personnel "Jeton d'Accès"
-
pip3 install links-from-link-header
- hub
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 %
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