Comment récupérer la liste de tous les référentiels GitHub d'une personne?

90

Nous travaillons sur un projet où nous devons afficher tous les projets d'une personne dans son référentiel sur un compte GitHub.

Quelqu'un peut-il suggérer, comment puis-je afficher les noms de tous les référentiels git d'une personne en particulier en utilisant son nom git-user?

user1127981
la source

Réponses:

63

Vous pouvez utiliser l' API github pour cela. Si vous cliquez dessus https://api.github.com/users/USERNAME/repos, les référentiels publics de l'utilisateur USERNAME seront répertoriés .

Frederick Cheung
la source
6
vous pouvez également choisir le montant des dépôts que vous obtenez avec ?per_page= developer.github.com/v3/#pagination
OzzyCzech
1
api.github.com/users/USERNAME/repos?page=1 donne la première page de résultats. (changer 1 en 2 et ainsi de suite, la valeur par défaut est 30 résultats par page)
stevec
39

Utilisez l' API Github :

/users/:user/repos

Cela vous donnera tous les référentiels publics de l'utilisateur. Si vous avez besoin de découvrir des référentiels privés, vous devrez vous authentifier en tant qu'utilisateur particulier. Vous pouvez ensuite utiliser l'appel REST:

/user/repos

pour trouver tous les dépôts de l'utilisateur.

Pour faire cela en Python, faites quelque chose comme:

USER='AUSER'
API_TOKEN='ATOKEN'
GIT_API_URL='https://api.github.com'

def get_api(url):
    try:
        request = urllib2.Request(GIT_API_URL + url)
        base64string = base64.encodestring('%s/token:%s' % (USER, API_TOKEN)).replace('\n', '')
        request.add_header("Authorization", "Basic %s" % base64string)
        result = urllib2.urlopen(request)
        result.close()
    except:
        print 'Failed to get api request from %s' % url

Où l'url passée à la fonction est l'url REST comme dans les exemples ci-dessus. Si vous n'avez pas besoin de vous authentifier, modifiez simplement la méthode pour supprimer l'ajout de l'en-tête d'autorisation. Vous pouvez ensuite obtenir n'importe quelle URL publique d'API en utilisant une simple requête GET.

BeRecursive
la source
27
Cela ne donnera que la première "page" de l'ensemble de résultats, qui est fixée à 30 éléments par défaut. Vous pouvez utiliser ?per_page=100pour obtenir le montant maximum, mais si un utilisateur a plus d'une centaine de dépôts, vous devrez suivre plusieurs nextURL dans l'en- Linktête HTTP envoyé avec la réponse.
Potherca
2
Merci @Potherca, exactement ce que je cherchais!
aknuds1
33

Essayez la curlcommande suivante pour répertorier les référentiels:

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

Pour répertorier les URL clonées, exécutez:

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

S'il est privé, vous devez ajouter votre clé API ( access_token=GITHUB_API_TOKEN), par exemple:

curl "https://api.github.com/users/$GHUSER/repos?access_token=$GITHUB_API_TOKEN" | grep -w clone_url

Si l'utilisateur est une organisation, utilisez à la /orgs/:username/reposplace pour renvoyer tous les référentiels.

Pour les cloner, consultez: Comment cloner tous les dépôts à la fois à partir de GitHub?

Voir aussi: Comment télécharger GitHub Release à partir d'un dépôt privé en utilisant la ligne de commande

Kenorb
la source
9
Cela n'affiche que les 100 premiers référentiels, quel que soit le fichier per_page=1000.
jm666
2
Ajoutez l' -soption à votre curlcommande pour vous débarrasser de ces barres de progression disgracieuses, comme danscurl -s ...
xmnboy
5
Comme @ jm666 le dit, la taille maximale de la page est de 100. Pour voir la 2ème page, faites: curl " api.github.com/users/$USER/repos?per_page=100 \ & page = 2"
rscohn2
2
L'exemple privé ne fonctionnera pas avec l'exemple, / users / "in plural" ne renvoie que les dépôts publics. Vous devez aller avec api.github.com/user/repos et ajouter le jeton dans la demande pour en obtenir des privés.
LeandroCR
2
@kenorb mystère résolu, l'utilisateur est une organisation alors /orgs/:username/reposretournez tous les dépôts, /users/...retournez une partie d'entre eux, c'est en effet bizarre. le nom d'utilisateur peut être traité à la fois comme un utilisateur ou comme une organisation.
ios apprenant
11

Si jq est installé, vous pouvez utiliser la commande suivante pour lister tous les dépôts publics d'un utilisateur

curl -s https://api.github.com/users/<username>/repos | jq '.[]|.html_url'
vaibhav singhal
la source
6

Vous avez probablement besoin d'une solution jsonp:

https://api.github.com/users/[user name]/repos?callback=abc

Si vous utilisez jQuery:

$.ajax({
  url: "https://api.github.com/users/blackmiaool/repos",
  jsonp: true,
  method: "GET",
  dataType: "json",
  success: function(res) {
    console.log(res)
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

blackmiaool
la source
3

Le module de NPM repo saisit le JSON pour les prises en pension publique pour un utilisateur ou d'un groupe. Vous pouvez l'exécuter directement depuis npxpour ne pas avoir besoin d'installer quoi que ce soit, choisissez simplement une organisation ou un utilisateur ("W3C" ici):

$ npx repos W3C W3Crepos.json

Cela créera un fichier appelé W3Crepos.json. Grep est assez bon pour récupérer par exemple la liste des dépôts:

$ grep full_name W3Crepos.json

avantages:

  • Fonctionne avec plus de 100 dépôts (de nombreuses réponses à cette question ne le font pas).
  • Pas grand chose à taper.

les inconvénients:

  • Nécessite npx(ou npmsi vous souhaitez l'installer pour de vrai).
ericP
la source
3

Récupérez la liste de tous les référentiels publics d'un utilisateur GitHub à l'aide de Python:

import requests
username = input("Enter the github username:")
request = requests.get('https://api.github.com/users/'+username+'/repos')
json = request.json()
for i in range(0,len(json)):
  print("Project Number:",i+1)
  print("Project Name:",json[i]['name'])
  print("Project URL:",json[i]['svn_url'],"\n")

Référence

darshanc99
la source
1
cela ne fonctionne pas (peut-être pour une version plus ancienne de l'API)
OzzyCzech
2
oui, il y a un petit changement. J'ai édité ma réponse et maintenant cela fonctionne bien.
darshanc99 le
3

Il existe maintenant une option pour utiliser l'impressionnant explorateur d'API GraphQL .

Je voulais une liste de tous les dépôts actifs de mon organisation avec leurs langues respectives. Cette requête fait exactement cela:

{
  organization(login: "ORG_NAME") {
    repositories(isFork: false, first: 100, orderBy: {field: UPDATED_AT, direction: DESC}) {
      pageInfo {
        endCursor
      }
      nodes {
        name
        updatedAt
        languages(first: 5, orderBy: {field: SIZE, direction: DESC}) {
          nodes {
            name
          }
        }
        primaryLanguage {
          name
        }
      }
    }
  }
}

Pavel Brodsky
la source
3

Si vous recherchez des pensions d'une organisation-

api.github.com/orgs/$NAMEOFORG/repos

Exemple:

curl https://api.github.com/orgs/arduino-libraries/repos

Vous pouvez également ajouter le paramètre per_page pour obtenir tous les noms au cas où il y aurait un problème de pagination-

curl https://api.github.com/orgs/arduino-libraries/repos?per_page=100
Manthan_Admane
la source
3

Voici une spécification complète de l'API repos:

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

GET /users/:username/repos

Paramètres de chaîne de requête:

Les 5 premiers sont documentés dans le lien API ci-dessus. Les paramètres pour pageet per_pagequi sont documentés ailleurs et sont utiles dans une description complète.

  • type(string): Peut - être l' un des all, owner, member. Défaut:owner
  • sort(string): Peut - être l' un des created, updated, pushed, full_name. Défaut:full_name
  • direction(chaîne): peut être l'un de ascou desc. Par défaut: asclors de l'utilisation full_name, sinondesc
  • page (entier): page actuelle
  • per_page (entier): nombre d'enregistrements par page

Puisqu'il s'agit d'une API HTTP GET, en plus de cURL, vous pouvez l'essayer simplement dans le navigateur. Par exemple:

https://api.github.com/users/grokify/repos?per_page=1&page=2

Grokify
la source
2

HTML

<div class="repositories"></div>

JavaScript

// Dépôts Github

Si vous souhaitez limiter la liste des référentiels, vous pouvez simplement ajouter ?per_page=3après username/repos.

par exemple username/repos?per_page=3

Au lieu de / username/, vous pouvez mettre le nom d'utilisateur de n'importe quelle personne sur Github.

var request = new XMLHttpRequest();
        request.open('GET','https://api.github.com/users/username/repos' , 
        true)
        request.onload = function() {
            var data = JSON.parse(this.response);
            console.log(data);
            var statusHTML = '';
            $.each(data, function(i, status){
                statusHTML += '<div class="card"> \
                <a href=""> \
                    <h4>' + status.name +  '</h4> \
                    <div class="state"> \
                        <span class="mr-4"><i class="fa fa-star mr-2"></i>' + status.stargazers_count +  '</span> \
                        <span class="mr-4"><i class="fa fa-code-fork mr-2"></i>' + status.forks_count + '</span> \
                    </div> \
                </a> \
            </div>';
            });
            $('.repositories').html(statusHTML);
        }
        request.send();
Murtaza JAFARI
la source
1

Pagination JSON

Le code JS ci-dessous est destiné à être utilisé dans une console.

username = "mathieucaroff";

w = window;
Promise.all(Array.from(Array(Math.ceil(1+184/30)).keys()).map(p =>
    fetch(`//api.github.com/users/{username}/repos?page=${p}`).then(r => r.json())
)).then(all => {
    w.jo = [].concat(...all);
    // w.jo.sort();
    // w.jof = w.jo.map(x => x.forks);
    // w.jow = w.jo.map(x => x.watchers)
})
Mathieu CAROFF
la source
1

La réponse est "/ users /: user / repo", mais j'ai tout le code qui fait cela dans un projet open-source que vous pouvez utiliser pour mettre en place une application Web sur un serveur.

J'ai lancé un projet GitHub appelé Git-Captain qui communique avec l'API GitHub qui répertorie tous les dépôts.

Il s'agit d'une application Web open source construite avec Node.js utilisant l'API GitHub pour rechercher, créer et supprimer une branche dans de nombreux référentiels GitHub.

Il peut être configuré pour les organisations ou un seul utilisateur.

J'ai une étape par étape comment le configurer également dans le read-me.

Cerf confus
la source
1

Pour obtenir l'URL des 100 dépôts publics de l'utilisateur:

$.getJSON("https://api.github.com/users/suhailvs/repos?per_page=100", function(json) {
  var resp = '';
  $.each(json, function(index, value) {
    resp=resp+index + ' ' + value['html_url']+ ' -';
    console.log(resp);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

suhailvs
la source
1
const request = require('request');
const config = require('config');

router.get('/github/:username', (req, res) => {
    try {
        const options = {

            uri: `https://api.github.com/users/${req.params.username}/repos?per_page=5
                 &sort=created:asc
                 &client_id=${config.get('githubClientId')}
                 &client_secret=${config.get('githubSecret')}`,

            method: 'GET',

            headers: { 'user-agent': 'node.js' }
        };
        request(options, (error, response, body) => {
            if (error) console.log(error);
            if (response.statusCode !== 200) {
                res.status(404).json({ msg: 'No Github profile found.' })
            }
            res.json(JSON.parse(body));
        })
    } catch (err) {
        console.log(err.message);
        res.status(500).send('Server Error!');
    }
});
Vishal Kank
la source
1
pour plus de détails, visitez git docs-> developer.github.com/v3/repos
Vishal Kank
1
Bienvenue à SO! Veuillez vérifier ceci avant de poster ... Lorsque vous postez une réponse et qu'il y en a d'autres, montrez les avantages de votre PDV et, s'il vous plaît, ne vous contentez pas de poster un code, expliquez-le un peu.
David García Bodego