Come recuperare l'elenco di tutti i repository GitHub di una persona?


94

Stiamo lavorando a un progetto in cui dobbiamo visualizzare tutti i progetti di una persona nel suo repository sull'account GitHub.

Qualcuno può suggerire, come posso visualizzare i nomi di tutti i repository git di una determinata persona usando il suo nome utente git?

Risposte:



40

Usa l' API Github :

/users/:user/repos

Questo ti darà tutti i repository pubblici dell'utente. Se hai bisogno di trovare archivi privati, dovrai autenticarti come utente specifico. È quindi possibile utilizzare la chiamata REST:

/user/repos

per trovare tutti i repository dell'utente.

Per farlo in Python, fai qualcosa come:

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

Dove l'URL passato alla funzione è l'URL REST come negli esempi precedenti. Se non è necessario eseguire l'autenticazione, modificare semplicemente il metodo per rimuovere l'aggiunta dell'intestazione di autorizzazione. È quindi possibile ottenere qualsiasi URL API pubblico utilizzando una semplice richiesta GET.


27
Questo darà solo la prima "pagina" del set di risultati, che è impostato a 30 elementi per impostazione predefinita. Puoi usarlo ?per_page=100per ottenere la quantità massima di denaro, ma se un utente ha più di cento repo dovrai seguire diversi nextURL nell'intestazione HTTP Linkinviata con la risposta.
Potherca

2
Grazie @Potherca, proprio quello che stavo cercando!
aknuds1

34

Prova il seguente curlcomando per elencare i repository:

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

Per elencare gli URL clonati, esegui:

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

Se è privato, devi aggiungere la tua chiave API ( access_token=GITHUB_API_TOKEN), ad esempio:

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

Se l'utente è un'organizzazione, utilizza /orgs/:username/reposinvece per restituire tutti i repository.

Per clonarli, vedere: Come clonare tutti i repository contemporaneamente da GitHub?

Vedi anche: Come scaricare GitHub Release da un repository privato utilizzando la riga di comando


9
Questo mostra solo i primi 100 repository, indipendentemente dal file per_page=1000.
jm666

2
Aggiungi l' -sopzione al tuo curlcomando per sbarazzarti di quelle antiestetiche barre di avanzamento, come incurl -s ...
xmnboy

5
Come dice @ jm666, la dimensione massima della pagina è 100. Per vedere la seconda pagina, fai: curl " api.github.com/users/$USER/repos?per_page=100 \ & page = 2"
rscohn2

2
L'esempio privato non funzionerà con l'esempio, / utenti / "al plurale" restituisce solo i repository pubblici. Devi andare con api.github.com/user/repos e aggiungere il token nella richiesta per ottenere quelli privati.
LeandroCR

2
@kenorb mistero risolto, l'utente è un'organizzazione quindi /orgs/:username/reposrestituisci tutti i repository, /users/...restituisci una parte di essi, questo è davvero strano. il nome utente può essere trattato sia come utente che come organizzazione.
ios learner

11

Se hai installato jq , puoi usare il seguente comando per elencare tutti i repository pubblici di un utente

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

6

Probabilmente hai bisogno di una soluzione jsonp:

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

Se usi 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>


3

I repository del modulo NPM acquisiscono il JSON per tutti i repository pubblici per alcuni utenti o gruppi. Puoi eseguirlo direttamente da npxcosì non è necessario installare nulla, basta selezionare un'organizzazione o un utente ("W3C" qui):

$ npx repos W3C W3Crepos.json

Questo creerà un file chiamato W3Crepos.json. Grep è abbastanza buono da recuperare, ad esempio, l'elenco dei repository:

$ grep full_name W3Crepos.json

professionisti:

  • Funziona con più di 100 repo (molte risposte a questa domanda no).
  • Non c'è molto da scrivere.

contro:

  • Richiede npx(o npmse vuoi installarlo per davvero).

3

Recupera l'elenco di tutti i repository pubblici di un utente GitHub utilizzando 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")

Riferimento


1
questo non funziona (forse è per la versione più vecchia di API)
OzzyCzech

2
sì, c'è un piccolo cambiamento. Ho modificato la mia risposta e ora funziona bene.
darshanc99

3

Ora c'è un'opzione per utilizzare il fantastico GraphQL API Explorer .

Volevo un elenco di tutti i repository attivi della mia organizzazione con le rispettive lingue. Questa query fa proprio questo:

{
  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
        }
      }
    }
  }
}


3

Se cerchi repo di un'organizzazione-

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

Esempio:

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

Inoltre puoi aggiungere il parametro per_page per ottenere tutti i nomi nel caso in cui ci sia un problema di impaginazione-

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

3

Ecco una specifica completa per l'API dei repository:

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

GET /users/:username/repos

Parametri della stringa di query:

I primi 5 sono documentati nel collegamento API sopra. I parametri per pagee per_pageche sono documentati altrove e sono utili in una descrizione completa.

  • type(stringa): Può essere uno dei all, owner, member. Predefinito:owner
  • sort(stringa): Può essere uno dei created, updated, pushed, full_name. Predefinito:full_name
  • direction(stringa): può essere uno di asco desc. Default: ascquando si usa full_name, altrimentidesc
  • page (intero): pagina corrente
  • per_page (intero): numero di record per pagina

Poiché si tratta di un'API HTTP GET, oltre a cURL, puoi provarla semplicemente nel browser. Per esempio:

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


2

HTML

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

JavaScript

// Repository Github

Se vuoi limitare l'elenco dei repository, puoi semplicemente aggiungere ?per_page=3dopo username/repos.

per esempio username/repos?per_page=3

Invece di / username/, puoi inserire il nome utente di qualsiasi persona su 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();

1

Paging JSON

Il codice JS di seguito è pensato per essere utilizzato in una 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)
})

1

La risposta è "/ users /: user / repo", ma ho tutto il codice che lo fa in un progetto open-source che puoi usare per installare un'applicazione web su un server.

Ho sostenuto un progetto GitHub chiamato Git-Captain che comunica con l'API GitHub che elenca tutti i repository.

È un'applicazione web open source costruita con Node.js che utilizza l'API GitHub per trovare, creare ed eliminare un ramo in numerosi repository GitHub.

Può essere configurato per organizzazioni o un singolo utente.

Ho anche istruzioni dettagliate su come configurarlo nel file read-me.


1

Per ottenere l'URL dei 100 repository pubblici dell'utente:

$.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>


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!');
    }
});

1
per maggiori dettagli visita git docs-> developer.github.com/v3/repos
Vishal Kank

1
Benvenuto in SO! Per favore controlla questo prima di postare ... Quando pubblichi una risposta e ce ne sono altre, mostra i pro del tuo POV e, per favore, non limitarti a postare il codice, spiegalo un po '.
David García Bodego
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.