Wie kann ich die Liste aller GitHub-Repositorys einer Person abrufen?


93

Wir arbeiten an einem Projekt, bei dem wir alle Projekte einer Person in ihrem Repository auf dem GitHub-Konto anzeigen müssen.

Kann jemand vorschlagen, wie ich die Namen aller Git-Repositorys einer bestimmten Person unter Verwendung ihres Git-Benutzernamens anzeigen kann?

Antworten:



39

Verwenden Sie die Github-API :

/users/:user/repos

Dadurch erhalten Sie alle öffentlichen Repositorys des Benutzers. Wenn Sie private Repositorys herausfinden möchten, müssen Sie sich als bestimmter Benutzer authentifizieren. Sie können dann den REST-Aufruf verwenden:

/user/repos

um alle Repos des Benutzers zu finden .

Um dies in Python zu tun, gehen Sie wie folgt vor:

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

Wo die an die Funktion übergebene URL die REST-URL ist, wie in den obigen Beispielen. Wenn Sie sich nicht authentifizieren müssen, ändern Sie einfach die Methode, um das Hinzufügen des Autorisierungsheaders zu entfernen. Sie können dann jede öffentliche API-URL mit einer einfachen GET-Anfrage erhalten.


27
Dies gibt nur die erste "Seite" der Ergebnismenge an, die standardmäßig auf 30 Elemente festgelegt ist. Sie können verwenden ?per_page=100, um die maximale Menge zu erhalten. Wenn ein Benutzer jedoch mehr als hundert Repos hat, müssen Sie mehreren nextURLs im HTTP- LinkHeader folgen , die mit der Antwort gesendet werden .
Potherca

2
Danke @Potherca, genau das, wonach ich gesucht habe!
aknuds1

34

Versuchen Sie den folgenden curlBefehl, um die Repositorys aufzulisten:

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

Führen Sie Folgendes aus, um geklonte URLs aufzulisten:

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

Wenn es privat ist, müssen Sie Ihren API-Schlüssel ( access_token=GITHUB_API_TOKEN) hinzufügen , zum Beispiel:

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

Wenn der Benutzer eine Organisation ist, verwenden Sie /orgs/:username/reposstattdessen, um alle Repositorys zurückzugeben.

Informationen zum Klonen finden Sie unter: Wie werden alle Repos gleichzeitig von GitHub geklont?

Siehe auch: So laden Sie GitHub Release über die Befehlszeile von einem privaten Repo herunter


9
Dies zeigt nur die ersten 100 Repositorys, unabhängig von der per_page=1000.
jm666

2
Fügen Sie -sIhrem curlBefehl die Option hinzu , um diese unschönen Fortschrittsbalken zu curl -s ...
entfernen

5
Wie @ jm666 sagt, beträgt die maximale Seitengröße 100. Um die zweite Seite anzuzeigen , gehen Sie wie folgt vor : curl " api.github.com/users/$USER/repos?per_page=100 \ & page = 2"
rscohn2

2
Das private Beispiel funktioniert nicht mit dem Beispiel. / Users / "im Plural" gibt nur öffentliche Repos zurück. Sie müssen mit api.github.com/user/repos das Token in die Anfrage einfügen , um private Token zu erhalten.
LeandroCR

2
@kenorb Rätsel gelöst, der Benutzer ist eine Organisation, also gib /orgs/:username/reposalle Repos zurück, gib einen /users/...Teil von ihnen zurück, das ist in der Tat komisch. Der Benutzername kann sowohl als Benutzer als auch als Organisation behandelt werden.
Ios Lerner

11

Wenn Sie jq installiert haben, können Sie mit dem folgenden Befehl alle öffentlichen Repos eines Benutzers auflisten

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

6

Sie benötigen wahrscheinlich eine JSONP-Lösung:

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

Wenn Sie jQuery verwenden:

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

Das NPM-Modul- Repos erfasst den JSON für alle öffentlichen Repos für einen Benutzer oder eine Gruppe. Sie können dies direkt ausführen, npxsodass Sie nichts installieren müssen. Wählen Sie einfach eine Organisation oder einen Benutzer aus ("W3C" hier):

$ npx repos W3C W3Crepos.json

Dadurch wird eine Datei mit dem Namen W3Crepos.json erstellt. Grep ist gut genug, um zB die Liste der Repos abzurufen:

$ grep full_name W3Crepos.json

Profis:

  • Funktioniert mit mehr als 100 Repos (viele Antworten auf diese Frage nicht).
  • Nicht viel zu tippen.

Nachteile:

  • Benötigt npx(oder npmwenn Sie es wirklich installieren möchten).

3

Rufen Sie mit Python die Liste aller öffentlichen Repositorys eines GitHub-Benutzers ab:

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

Referenz


1
Dies funktioniert nicht (vielleicht ist es für ältere API-Version)
OzzyCzech

2
Ja, es gibt eine kleine Änderung. Ich habe meine Antwort bearbeitet und jetzt funktioniert es gut.
darshanc99

3

Es gibt jetzt eine Option, um den fantastischen GraphQL API Explorer zu verwenden .

Ich wollte eine Liste aller aktiven Repos meiner Organisation mit ihren jeweiligen Sprachen. Diese Abfrage macht genau das:

{
  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

Wenn Sie nach Repos einer Organisation suchen -

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

Beispiel:

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

Sie können auch den Parameter per_page hinzufügen, um alle Namen abzurufen, falls ein Paginierungsproblem vorliegt.

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

3

Hier ist eine vollständige Spezifikation für die Repos-API:

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

GET /users/:username/repos

Parameter für Abfragezeichenfolgen:

Die ersten 5 sind im obigen API-Link dokumentiert. Die Parameter für pageund, per_pagedie an anderer Stelle dokumentiert sind und in einer vollständigen Beschreibung nützlich sind.

  • type(string): Kann einer der folgenden sein all, owner, member. Standard:owner
  • sort(string): Kann einer der folgenden sein created, updated, pushed, full_name. Standard:full_name
  • direction(Zeichenfolge): Kann eine von ascoder sein desc. Standard: sonst ascbei Verwendungfull_namedesc
  • page (Ganzzahl): Aktuelle Seite
  • per_page (Ganzzahl): Anzahl der Datensätze pro Seite

Da es sich neben cURL um eine HTTP-GET-API handelt, können Sie dies einfach im Browser ausprobieren. Zum Beispiel:

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


2

HTML

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

JavaScript

// Github Repos

Wenn Sie die Liste der Repositorys einschränken möchten, können Sie sie einfach ?per_page=3nachher hinzufügen username/repos.

z.B username/repos?per_page=3

Anstelle von / username/ können Sie den Benutzernamen jeder Person auf Github setzen.

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

Der folgende JS-Code soll in einer Konsole verwendet werden.

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

Die Antwort lautet "/ users /: user / repo", aber ich habe den gesamten Code, der dies in einem Open-Source-Projekt tut, mit dem Sie eine Webanwendung auf einem Server starten können.

Ich habe ein GitHub-Projekt namens Git-Captain ins Leben gerufen , das mit der GitHub-API kommuniziert, in der alle Repos aufgelistet sind.

Es ist eine Open-Source-Webanwendung, die mit Node.js unter Verwendung der GitHub-API erstellt wurde, um einen Zweig in zahlreichen GitHub-Repositorys zu finden, zu erstellen und zu löschen.

Es kann für Organisationen oder einen einzelnen Benutzer eingerichtet werden.

Ich habe eine Schritt-für-Schritt-Anleitung zum Einrichten.


1

So rufen Sie die URL des 100 öffentlichen Repositorys des Benutzers ab:

$.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
Weitere Informationen finden Sie unter git docs-> developer.github.com/v3/repos
Vishal Kank

1
Willkommen bei SO! Bitte überprüfe dies vor dem Posten ... Wenn du eine Antwort postest und es noch mehr gibt, zeige die Vorteile deines POV und bitte poste nicht nur die Postleitzahl, sondern erkläre sie ein wenig.
David García Bodego
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.