Jak pobrać listę wszystkich repozytoriów GitHub danej osoby?


89

Pracujemy nad projektem, w którym musimy wyświetlić wszystkie projekty osoby w jej repozytorium na koncie GitHub.

Czy ktoś może zasugerować, jak mogę wyświetlić nazwy wszystkich repozytoriów git konkretnej osoby, używając jej nazwy git-user?

Odpowiedzi:



39

Skorzystaj z Github API :

/users/:user/repos

W ten sposób otrzymasz wszystkie publiczne repozytoria użytkownika. Jeśli chcesz znaleźć prywatne repozytoria, musisz uwierzytelnić się jako konkretny użytkownik. Następnie możesz użyć wywołania REST:

/user/repos

aby znaleźć wszystkie repozytoria użytkownika.

Aby to zrobić w Pythonie, zrób coś takiego:

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

Gdzie adres URL przekazany do funkcji jest adresem URL REST, jak w przykładach powyżej. Jeśli nie potrzebujesz uwierzytelniania, po prostu zmodyfikuj metodę, aby usunąć dodawanie nagłówka Authorization. Następnie możesz uzyskać dowolny publiczny adres URL interfejsu API za pomocą prostego żądania GET.


27
Spowoduje to wyświetlenie tylko pierwszej „strony” zestawu wyników, która jest domyślnie ustawiona na 30 pozycji. Możesz użyć, ?per_page=100aby uzyskać maksymalną kwotę, ale jeśli użytkownik ma więcej niż sto repozytoriów, będziesz musiał śledzić kilka nextadresów URL w Linknagłówku HTTP wysyłanym z odpowiedzią.
Potherca

2
Dzięki @Potherca, właśnie tego szukałem!
aknuds1

33

Wypróbuj następujące curlpolecenie, aby wyświetlić listę repozytoriów:

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

Aby wyświetlić sklonowane adresy URL, uruchom:

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

Jeśli jest prywatny, musisz dodać swój klucz API ( access_token=GITHUB_API_TOKEN), na przykład:

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

Jeśli użytkownik jest organizacją, użyj /orgs/:username/reposzamiast tego, aby zwrócić wszystkie repozytoria.

Aby je sklonować, zobacz: Jak sklonować wszystkie repozytoria jednocześnie z GitHub?

Zobacz też: Jak pobrać GitHub Release z prywatnego repozytorium za pomocą wiersza poleceń


9
To pokazuje tylko pierwsze 100 repozytoriów, niezależnie od per_page=1000.
jm666

2
Dodaj -sopcję do curlpolecenia, aby pozbyć się tych brzydkich pasków postępu, jak wcurl -s ...
xmnboy

5
Jak mówi @ jm666, maksymalny rozmiar strony to 100. Aby zobaczyć drugą stronę, wykonaj: curl " api.github.com/users/$USER/repos?per_page=100 \ & page = 2"
rscohn2

2
Przykład prywatny nie będzie działał z przykładem, / users / "in plural" zwraca tylko publiczne repozytoria. Musisz przejść na api.github.com/user/repos i dodać token do żądania, aby uzyskać prywatne.
LeandroCR

2
Tajemnica @kenorb rozwiązana, użytkownik jest organizacją, więc /orgs/:username/reposzwróć wszystkie repozytoria, /users/...zwróć ich część, to naprawdę dziwne. nazwa użytkownika może być traktowana zarówno jako użytkownik, jak i organizacja.
uczeń

11

Jeśli masz zainstalowany jq , możesz użyć następującego polecenia, aby wyświetlić wszystkie publiczne repozytoria użytkownika

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

6

Prawdopodobnie potrzebujesz rozwiązania JSONP:

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

Jeśli używasz 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

Moduł NPM repo chwyta JSON dla wszystkich transakcji repo publicznych dla jakiegoś użytkownika lub grupy. Możesz to uruchomić bezpośrednio z poziomu, npxwięc nie musisz niczego instalować, wystarczy wybrać organizację lub użytkownika („W3C” tutaj):

$ npx repos W3C W3Crepos.json

Spowoduje to utworzenie pliku o nazwie W3Crepos.json. Grep jest wystarczająco dobry, aby np. Pobrać listę repozytoriów:

$ grep full_name W3Crepos.json

plusy:

  • Działa z ponad 100 repozytoriami (wiele odpowiedzi na to pytanie nie).
  • Niewiele do pisania.

Cons:

  • Wymaga npx(lub npmjeśli chcesz go zainstalować naprawdę).

3

Pobierz listę wszystkich publicznych repozytoriów użytkownika GitHub za pomocą Pythona:

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

Odniesienie


1
to nie działa (może to dla starszej wersji api)
OzzyCzech

2
tak, jest mała zmiana. Zredagowałem odpowiedź i teraz działa dobrze.
darshanc99

3

Jest teraz opcja korzystania z niesamowitego GraphQL API Explorer .

Chciałem uzyskać listę wszystkich aktywnych repozytoriów mojej organizacji z ich odpowiednimi językami. To zapytanie robi właśnie to:

{
  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

Jeśli szukasz repozytoriów organizacji-

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

Przykład:

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

Możesz również dodać parametr per_page, aby uzyskać wszystkie nazwy na wypadek, gdyby wystąpił problem z paginacją.

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

3

Oto pełna specyfikacja interfejsu API repozytoriów:

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

GET /users/:username/repos

Parametry ciągu zapytania:

Pierwsze 5 jest udokumentowane w powyższym linku API. Parametry dla pagei per_pagektóre są udokumentowane w innym miejscu i są przydatne w pełnym opisie.

  • type(string): Może być jednym z all, owner, member. Domyślna:owner
  • sort(string): Może być jednym z created, updated, pushed, full_name. Domyślna:full_name
  • direction(ciąg): może być jednym z asclub desc. Domyślnie: ascpodczas używania full_name, w przeciwnym raziedesc
  • page (liczba całkowita): Bieżąca strona
  • per_page (liczba całkowita): liczba rekordów na stronę

Ponieważ jest to interfejs API HTTP GET, oprócz cURL, możesz go wypróbować po prostu w przeglądarce. Na przykład:

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


2

HTML

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

JavaScript

// Repozytoria Github

Jeśli chcesz ograniczyć listę repozytoriów, możesz po prostu dodać ?per_page=3po username/repos.

na przykład username/repos?per_page=3

Zamiast / username/ możesz umieścić nazwę użytkownika dowolnej osoby na 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

Poniższy kod JS jest przeznaczony do użycia w konsoli.

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

Odpowiedź brzmi: „/ users /: user / repo”, ale mam cały kod, który to robi w projekcie open source, którego można użyć do wystawienia aplikacji internetowej na serwerze.

Uruchomiłem projekt GitHub o nazwie Git-Captain, który komunikuje się z interfejsem API GitHub, który zawiera listę wszystkich repozytoriów.

Jest to aplikacja internetowa typu open source zbudowana przy użyciu Node.js przy użyciu interfejsu API GitHub do znajdowania, tworzenia i usuwania gałęzi w wielu repozytoriach GitHub.

Można go skonfigurować dla organizacji lub pojedynczego użytkownika.

Mam również instrukcje krok po kroku, jak to skonfigurować w read-me.


1

Aby uzyskać adres URL 100 repozytoriów publicznych użytkownika:

$.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
Aby uzyskać więcej informacji, odwiedź stronę git docs-> developer.github.com/v3/repos
Vishal Kank

1
Witamy w SO! Sprawdź to przed wysłaniem… Kiedy wyślesz odpowiedź, a jest ich więcej, pokaż zalety swojego punktu widzenia i, proszę, nie wysyłaj tylko kodu pocztowego, wyjaśnij to trochę.
David García Bodego
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.