Comment cloner tous les dépôts à la fois depuis GitHub?

97

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

git clone [email protected]:company/*.git 

ou similaire fonctionnerait, mais il ne semble pas aimer le caractère générique.

Existe-t-il un moyen dans Git de cloner puis de tout extraire en supposant que l'on dispose des autorisations appropriées?

numb3rs1x
la source
2
Bonne question. Et que diriez-vous de les garder synchronisés, via pull? L'une des réponses fonctionne-t-elle pour les pulls?
nealmcb
Nous avons besoin d'une solution python, pour ceux d'entre nous qui ne sont pas si adeptes du nœud ou du ruby;) Ou github devrait lire ceci et avoir pitié de nous et simplement fournir une interface Web simple pour cela ....
nealmcb

Réponses:

52

Je ne pense pas qu'il soit possible de le faire de cette façon. Votre meilleur pari est de trouver 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'objets JSON. Chaque objet comprendra des informations sur l'un des référentiels de cette organisation. Je pense que dans votre cas, vous chercherez spécifiquement la ssh_urlpropriété.
  • Ensuite, git clonechacun de ces ssh_urlart.

C'est un peu de travail supplémentaire, mais il est nécessaire que GitHub ait une authentification appropriée.

Thomas Kelley
la source
J'ai créé le jeton API et j'obtiens la sortie de l'appel, mais je ne vois rien qui fasse référence à ce que je sais de nos référentiels ou de la chaîne 'ssh_url'. Je soupçonne que je n'ai pas fait l'appel correctement. curl -i https://github.com/api/v3/orgs/company/repos?access_token=<token>
numb3rs1x
S'agit-il d'un compte GitHub Enterprise ou github.com?
Thomas Kelley
1
Ah, je vous ai mal compris. Je pensais que c'était un compte Enterprise. Au lieu de https://github.com/api/v3/, essayez https://api.github.com/.
Thomas Kelley
1
Et je ne sais pas comment votre entreprise est configurée, mais s'il s'agit d'un "utilisateur" au lieu d'une "organisation", vous voudrez utiliser le /users/${COMPANY}/reposchemin au lieu de /orgs/${COMPANY}/repos.
Thomas Kelley
1
Par GitHub: veuillez utiliser l'en-tête HTTP Authorization à la place, car l'utilisation du access_tokenparamètre de requête est obsolète. Si ce jeton est utilisé par une application sur laquelle vous n'avez pas de contrôle, sachez qu'il peut cesser de fonctionner en raison de cette dépréciation.
BogeyMan le
114

Sous Windows et tous les systèmes UNIX / LINUX , en utilisant Git Bash ou tout autre terminal , remplacez-le YOURUSERNAMEpar 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=userset NAME=yourusername, pour télécharger tous vos référentiels.
  • Définissez CNTX=orgset NAME=yourorgname, pour télécharger tous les référentiels de votre organisation.

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

Voici un script shell qui fait ce qui précède: https://gist.github.com/erdincay/4f1d2e092c50e78ae1ffa39d13fa404e

Erdinc Ay
la source
4
Solution pure bash, la plus simple. Pour votre information, ce code bash peut être exécuté dans presque n'importe quel environnement * nix, Linux, Cygwin, Mingw et bien sûr le Gitbash qui est en réalité une émulation de terminal comme les autres.
m3nda
1
Cela ne fonctionne pas avec les organisations, donc cela ne répond pas directement à la question. Cette réponse de Kenorb gère les organisations et fonctionne également jusqu'à 1000 dépôts - a mieux fonctionné pour moi.
RichVel
1
avec authentification: curl " api.github.com/$CNTX/$NAME/… " | grep -e 'git_url *' | cut -d \ "-f 4 | xargs -L1 git clone
Yannick Wurm
2
Veuillez mettre à jour la réponse (février-2019): selon l'API GitHub v3, votre curl devrait aller dans / orgs / ORGNAME / repos. Peut-être aussi inclure un lien vers l'API v3: developer.github.com/v3 Aussi pour les dépôts privés, vous devrez ajouter curl -u "username", puis curl vous demandera le mot de passe une fois. Sinon fonctionne très bien!
:)
1
MISE À JOUR du commentaire de dimitry hevkoplyas stackoverflow.com/questions/19576742/… . developer.github.com/v3 renvoie le statut 301 lors d'une tentative de curl. utilisez cette commande bash curl -u "{username}" " api.github.com/orgs {org} / repos? page = 1 & per_page = 100" | grep -o 'git @ [^ "] *' | xargs -L1 git clone fonctionne à 100%
Tommy
43

Référentiels d'organisation

Pour cloner tous les dépôts 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'utilisateurs

Cloner tout à l'aide des URL de 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 de clonage:

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
}

Dépôts privés

Si vous avez besoin de cloner les dépôts privés, vous pouvez ajouter un jeton d'autorisation dans votre en-tête comme:

-H 'Authorization: token <token>'

ou passez-le 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

Remarques:

  • Pour récupérer uniquement les référentiels privés, ajoutez-les type=privateà votre chaîne de requête.
  • Une autre façon consiste à utiliser hubaprès avoir configuré votre clé API.

Voir également:


Conseils :
- Pour augmenter la vitesse, définissez le nombre de processus parallèles en spécifiant le -Pparamètre pour xargs( -P4= 4 processus).
- Si vous devez augmenter les limites de GitHub, essayez de vous authentifier en spécifiant votre clé API.
- Ajouter --recursivepour récurer dans les sous-modules enregistrés et mettre à jour tous les sous-modules imbriqués à l'intérieur.

Kenorb
la source
2
per_page = 1000 maxes à 100
aehlke
20

Cet élément essentiel accomplit la tâche en une seule 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_pagesi nécessaire.

METTRE À JOUR:

Comme l'a mentionné ATutorMe, la taille maximale de la page est de 100, selon la documentation GitHub .

Si vous avez plus de 100 dépôts, vous devrez ajouter un pageparamètre à votre URL et vous pourrez 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 per_pageparamètre par défaut est 30.

seancdavis
la source
Une idée de la façon dont cela est fait pour les dépôts privés auxquels vous avez accès?
MichaelGofron
le second ne fonctionne pas car l'esperluette le fait passer à une tâche d'arrière-plan
slashdottir
J'ai ajouté & access_token = <my_access_token> à l'URL et cela a parfaitement fonctionné
rmartinus
2ème: page = 1 (!)
Yannick Wurm
5

Allez dans Paramètres du compte -> Application et créez une clé API,
puis 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"]} ]}'

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

Merci à Arnaud pour le code ruby.

Cory Klein
la source
5

Alors, j'ajouterai ma réponse aussi. :) (j'ai trouvé que c'est simple)

Récupérer la liste (j'ai utilisé la société "magento"):

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

Utilisez à la clone_urlplace ssh_urlpour 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 récupérer des dépôts privés, ajoutez simplement le paramètre GET ?access_token=YOURTOKEN

Kirby
la source
1
Oui, pas de rubis nécessaire, juste grepping ...
Xiao-Feng Li
4

J'ai trouvé un commentaire dans le gist @seancdavis fourni pour être très utile, surtout parce que, comme l'affiche originale, je voulais synchroniser tous les dépôts 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"]} ]}'

Remplacez [[USERNAME]] par votre nom d'utilisateur Github et [[ORGANIZATION]] par votre organisation Github. La sortie (métadonnées du référentiel 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 <ssh_url>"
  %x[git clone #{repo["ssh_url"]} ]
end
Garren S
la source
1
Cette solution a parfaitement fonctionné pour moi. En fait, tout ce dont j'avais besoin était de cloner tous mes dépôts de compte personnel sur ma nouvelle machine locale. Très pratique pour installer un nouveau poste de travail. Remarque: pour ce faire, j'ai dû changer .../orgs/[[organization]]/repos...pour .../users/[[username]]/repos.... Maintenant, je peux rapidement importer tout mon travail sur différentes machines locales. MERCI!
B. Bulpett
2

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

  • vérifie github vos dépôts disponibles
  • pour chacun, effectue 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'))]"
    
Evren Ozkan
la source
2
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
Julianzhang
la source
2
Veuillez ajouter une explication à votre solution. De cette façon, d'autres personnes ayant des problèmes similaires pourront comprendre votre solution plus facilement!
Nander Speerstra
Un détail est le besoin d'un numéro de page comme ?page=2.
Bruno Wego
2

Solution simple:

NUM_REPOS=1000
DW_FOLDER="Github_${NUM_REPOS}_repos"
mkdir ${DW_FOLDER}
cd ${DW_FOLDER}
for REPO in $(curl https://api.github.com/users/${GITHUB_USER}/repos?per_page=${NUM_REPOS} | awk '/ssh_url/{print $2}' | sed 's/^"//g' | sed 's/",$//g') ; do git clone ${REPO} ; done
Antonio Feitosa
la source
2

J'ai essayé quelques-unes des commandes et des outils ci-dessus, mais j'ai décidé qu'ils étaient trop compliqués, alors j'ai écrit un autre outil de ligne de commande pour ce faire, appelé github-dl.

Pour l'utiliser (en supposant que vous ayez installé nodejs)

npx github-dl -d /tmp/test wires

Cela obtiendrait une liste de tous les dépôts à partir de wireset écrirait des informations dans le testrépertoire, en utilisant les détails d'autorisation (utilisateur / pass) que vous fournissez sur la CLI.

En détail, il

  1. Demande d'authentification (prend en charge 2FA)
  2. Obtient la liste des dépôts pour l'utilisateur / l'organisation via l'API Github
  3. Est-ce que la pagination pour cela, donc plus de 100 repo pris en charge

Il ne clone pas réellement les dépôts, mais écrit plutôt un .txtfichier dans lequel vous pouvez passer xargspour faire le clonage, par exemple:

cd /tmp/test
cat wires-repo-urls.txt | xargs -n2 git clone

# or to pull
cat /tmp/test/wires-repo-urls.txt | xargs -n2 git pull

Peut-être que cela vous est utile; il ne s'agit que de quelques lignes de JS, il devrait donc être facile de s'adapter à vos besoins

fils
la source
1

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

Vous créez simplement une configuration comme celle-ci:

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

et faites gitall clonepar exemple. Ougitall pull

Vladislav Rastrusny
la source
1

Au cas où quelqu'un chercherait une solution Windows, voici une petite fonction dans PowerShell pour faire l'affaire (pourrait être oneliner / alias sinon le fait que j'en ai besoin pour fonctionner 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() }
}
Andrzej Lichnerowicz
la source
1

Donc, en pratique, si vous souhaitez cloner tous les dépôts de l'organisation FOOqui correspondent BAR, vous pouvez utiliser le one-liner 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 " $0 " & "}' |
  sh
Konr
la source
1

Un autre script shell avec des commentaires qui clone tous les référentiels (publics et privés) d'un utilisateur:

#!/bin/bash

USERNAME=INSERT_USERNAME_HERE
PASSWORD=INSERT_PASSWORD_HERE

# Generate auth header
AUTH=$(echo -n $USERNAME:$PASSWORD | base64)

# Get repository URLs
curl -iH "Authorization: Basic "$AUTH https://api.github.com/user/repos | grep -w clone_url > repos.txt

# Clean URLs (remove " and ,) and print only the second column
cat repos.txt | tr -d \"\, | awk '{print $2}'  > repos_clean.txt

# Insert username:password after protocol:// to generate clone URLs
cat repos_clean.txt |  sed "s/:\/\/git/:\/\/$USERNAME\:$PASSWORD\@git/g" > repos_clone.txt

while read FILE; do
    git clone $FILE
done <repos_clone.txt

rm repos.txt & rm repos_clone.txt
hlorande
la source
1

Créez un alias / func bash dans votre ~/.bashrc file

J'ai résolu ce problème pour mon équipe en créant une fonction alias / bash dans mon ~/.bashrc file

pas

ouvrez un terminal ou un shell Linux et ouvrez votre ~/.bashrc file:

sudo nano ~/.bashrc

ajoutez cette fonction:

CloneAll() {
    # Make the url to the input github organization's repository page.
    ORG_URL="https://api.github.com/orgs/${1}/repos?per_page=200";

    # List of all repositories of that organization (seperated by newline-eol).
    ALL_REPOS=$(curl -s ${ORG_URL} | grep html_url | awk 'NR%2 == 0' \
                | cut -d ':' -f 2-3 | tr -d '",');

    # Clone all the repositories.
    for ORG_REPO in ${ALL_REPOS}; do
        git clone ${ORG_REPO}.git;
    done
}

enregistrez et fermez votre fichier ~ / .bashrc puis fermez le terminal - vous devez faire ceci ou la nouvelle fonction ne s'initialise pas:

ouvrez un nouveau terminal et essayez-le:

CloneAll <your_github_org_name>

exemple : si votre URL de dépôt github personnelle s'appelle https://github.com/awesome-async, la commande serait

CloneAll awesome-async

Important

le per_page=200à la fin de la première variable ORG_URLdéfinit le nombre de dépôts qui seront clonés, alors faites particulièrement attention à cela:

ORG_URL="https://api.github.com/orgs/${1}/repos?per_page=200";  <---- make sure this is what you want

J'espère que cela t'aides! :)

Flavio
la source
Semble max. la valeur pour per_page est de 100 ... pour les grandes organisations, le numéro de page a été ajouté comme 2ème paramètre et cela fonctionne parfaitement pour mes besoins...repos?page=${2}&per_page=100";
sv3n
0

Vous pouvez obtenir une liste des référentiels en utilisant curl, puis itérer sur ladite 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
Sriram Mageswaran
la source
0

Pour cloner uniquement les dépôts privés, avec une clé d'accès, et avec python 3 et le module de requêtes 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;
ubugnu
la source
0

Une solution Python3 qui inclut une pagination exhaustive via LinkHeader.

Conditions préalables:


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 xargsou parallèle et:cat repolist | parallel -I% hub clone %

Jose Alban
la source
0

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 
Kasthuri Shravankumar
la source
s'il y a des dépôts privés, vous pouvez mettre à jour "user" de cette façon: user = " user: [email protected]/user "
Med Ali Difallah
0

J'ai créé un exemple de script batch. Vous pouvez télécharger tous les référentiels privés / publics depuis github.com. Une fois le référentiel téléchargé, il est automatiquement converti en fichier zip.

@echo off
setlocal EnableDelayedExpansion
SET "username=olyanren"
SET "password=G....."
set "mypath=%cd%\"
SET "url=https://%username%:%password%@github.com/%username%/"
FOR /F "tokens=* delims=" %%i in (files.txt) do (
SET repo=%%i
rmdir /s /q !repo!
git clone "!url!!repo!.git"
cd !repo!
echo !mypath!
git archive --format=zip -o "!mypath!!repo!.zip" HEAD
cd ..
)

Remarque: le fichier files.txt ne doit contenir que des noms de référentiel tels que:

repository1
repository2
olyanren
la source
0

Mise à jour du 19 mai

utiliser cette commande bash pour une organisation (dépôt privé inclus)

curl -u "{username}" "https://api.github.com/orgs/{org}/repos?page=1&per_page=100" | grep -o 'git@[^"]*' | xargs -L1 git clone
Tommy
la source
0

Les réponses prédominantes ici ne tiennent pas compte du fait que l'API Github ne renverra qu'un maximum de 100 référentiels malgré ce que vous pouvez spécifier dans per_page. Si vous clonez une organisation Github avec plus de 100 référentiels, vous devrez suivre les liens de pagination dans la réponse de l'API.

J'ai écrit un outil CLI pour faire exactement cela :

clone-github-org -o myorg

Cela clonera tous les référentiels de l' myorgorganisation dans le répertoire de travail actuel.

Tchad
la source
0

Pour les organisations auxquelles vous avez accès avec des dépôts privés:

curl -u <YOUR_GITHUB_USERNAME> -s https://api.github.com/orgs/<ORG_NAME>/repos?per_page=200 | ruby -rubygems -e ’require “json”; JSON.load(STDIN.read).each { |repo| %x[git clone #{repo[“html_url”]} ]}'

Il utilise le html_url, donc vous n'avez pas besoin d' access_tokenentrer simplement votre mot de passe github lorsque vous y êtes invité.

Flavio
la source
L'authentification de base à l'aide d'un mot de passe pour l'API est obsolète et ne fonctionnera bientôt plus. Visitez [deprecating-password-auth] ( developer.github.com/changes/… ) pour plus d'informations sur les solutions de contournement suggérées et les dates de suppression.
BogeyMan le
@BogeyMan merci pour la mise à jour!
Flavio
0

Clonez tous vos dépôts qui ne sont pas des fourchettes:

curl -u "username" https://api.github.com/user/repos\?page\=1\&per_page\=100 |
  jq -r 'map(select(.fork == false)) | .[] | .ssh_url' |
  xargs -L1 git clone

Clonez vos informations essentielles:

curl https://api.github.com/users/username/gists\?page\=1\&per_page\=100 |
   jq -r ".[] | .git_pull_url +\" '\" + (.files|keys|join(\"__\") + \"'\")" |
   xargs -L1 git clone

Cette jqcommande est complexe car le nom du dépôt de gists est un hachage, de sorte que la commande concatène tous les noms de fichiers pour être le nom du dépôt


Vous pouvez filtrer le JSON arbitrairement en utilisant jq

installer: sudo apt-get install jq

Dans l'exemple ci-dessus, j'ai filtré les fourchettes en utilisant ceci: curl ... | jq -r 'map(select(.fork == false))' ...- utile pour ne pas cloner des dépôts où vous avez fait des demandes d'extraction occasionnelles

jq prend en charge certaines fonctionnalités très avancées. man jqest votre ami


Vous pouvez vous authentifier avec curl -u "username" ... pour accéder aux dépôts privés


URL d'API de Guthub

  • Vos dépôts (nécessite une authentification): https://api.github.com/user/repos\?page\=1\&per_page\=100
  • Tout utilisateur: https://api.github.com/users/other_username/repos\?page\=1\&per_page\=100
  • Organisations: https://api.github.com/orgs/orgname/repos\?page\=1\&per_page\=100

Documents de l'API Github pour les dépôts

Madacol
la source
0
"""
Clone all public Github Repos

https://developer.github.com/v3/repos/#list-repositories-for-a-user
"""

import urllib.request, base64
import json
import os


def get_urls(username):
    url = f"https://api.github.com/users/{username}/repos?per_page=200"
    request = urllib.request.Request(url)
    result = urllib.request.urlopen(request)
    return json.load(result)


if __name__ == "__main__":
    for r in get_urls("MartinThoma"):
        if not os.path.isdir(r["name"]):
            print(f"Clone {r['name']}...")
            os.system("git clone " + r["ssh_url"])
        else:
            print(f"SKIP {r['name']}...")
Martin Thoma
la source
0

Pour cloner tous vos propres dépôts privés et publics, générez simplement un nouveau jeton d'accès avec un accès aux dépôts et utilisez ceci:

(remplacez-le par votre propre jeton d'accès et nom d'utilisateur)

for line in $(curl https://api.github.com/user/repos?access_token=ACCESS_TOKEN_HERE  | grep -o "[email protected]:YOUR_USER_NAME/[^ ,\"]\+");do git clone $line;done

Cela clonera tous les dépôts dans le dossier actuel

Ceci est un petit programme bash, vous pouvez simplement le coller dans le terminal et appuyer sur Entrée

Bâle Akasha
la source