Bir kişinin tüm GitHub depolarının listesi nasıl alınır?


94

Deposundaki bir kişinin tüm projelerini GitHub hesabında görüntülememiz gereken bir proje üzerinde çalışıyoruz.

Herhangi biri önerebilir, belirli bir kişinin git-kullanıcı adını kullanarak tüm git depolarının adlarını nasıl görüntüleyebilirim?

Yanıtlar:


67

Bunun için github api'sini kullanabilirsiniz . İsabet https://api.github.com/users/USERNAME/reposedildiğinde, USERNAME kullanıcısı için herkese açık kod depoları listelenir .


7
ayrıca adlı kişiyi almak ne kadar repolar seçebilir ?per_page= developer.github.com/v3/#pagination
OzzyCzech

1
api.github.com/users/USERNAME/repos?page=1 sonuçların ilk sayfasını verir. (1'i 2'ye değiştirin ve bu şekilde devam edin, varsayılan sayfa başına 30
sonuçtur

40

Github API'sini kullanın :

/users/:user/repos

Bu size kullanıcının tüm genel depolarını verecektir. Özel depoları bulmanız gerekirse, belirli kullanıcı olarak kimlik doğrulaması yapmanız gerekecektir. Daha sonra REST çağrısını kullanabilirsiniz:

/user/repos

tüm kullanıcının depolarını bulmak için.

Bunu Python'da yapmak için aşağıdaki gibi bir şey yapın:

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

İşleve iletilen url, yukarıdaki örneklerde olduğu gibi REST url'dir. Kimlik doğrulaması yapmanız gerekmiyorsa, Yetkilendirme başlığı eklemeyi kaldırmak için yöntemi değiştirmeniz yeterlidir. Daha sonra basit bir GET isteği kullanarak herhangi bir genel api url'sini alabilirsiniz.


27
Bu, sonuç kümesinin yalnızca varsayılan olarak 30 öğeye ayarlanan ilk "sayfasını" verecektir. ?per_page=100Maksimum miktarı elde etmek için kullanabilirsiniz , ancak bir kullanıcının yüzden fazla deposu varsa , yanıtla birlikte gönderilen nextHTTP Linkbaşlığındaki birkaç URL'yi izlemeniz gerekir .
Potherca

2
Teşekkürler @Potherca, tam da aradığım şey!
aknuds1

34

curlDepoları listelemek için aşağıdaki komutu deneyin :

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

Klonlanmış URL'leri listelemek için şunu çalıştırın:

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

Gizli ise, API anahtarınızı ( access_token=GITHUB_API_TOKEN) eklemeniz gerekir , örneğin:

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

Kullanıcı bir organizasyon ise, /orgs/:username/repostüm depoları döndürmek için bunun yerine kullanın .

Bunları klonlamak için bkz: GitHub'dan tüm depoları aynı anda nasıl klonlayabilirim?

Ayrıca bkz: GitHub Sürümünü komut satırını kullanarak özel depodan indirme


9
Bu yalnızca ilk 100 depoyu gösterir per_page=1000.
jm666

2
Bu çirkin ilerleme çubuklarından kurtulmak -siçin curlkomutunuza seçeneği ekleyin,curl -s ...
xmnboy

5
@ Jm666'nın dediği gibi, maksimum sayfa boyutu 100'dür. 2. sayfayı görmek için şunu yapın: curl " api.github.com/users/$USER/repos?per_page=100 \ & page = 2"
rscohn2

2
Özel örnek, örnekle çalışmaz, / users / "in plural" yalnızca genel depoları döndürür. Api.github.com/user/repos ile gitmeniz ve özel olanları almak için jetonu isteğe eklemeniz gerekir .
LeandroCR

2
@kenorb gizemi çözüldü, kullanıcı bir kuruluş, bu yüzden /orgs/:username/repostüm depoları /users/...iade edin, bir kısmını iade edin, bu gerçekten garip. kullanıcı adı hem kullanıcı hem de kuruluş olarak kabul edilebilir.
ios öğrenci

11

Eğer varsa jq yüklü, bir kullanıcının tüm kamu repo listelemek için aşağıdaki komutu kullanabilirsiniz

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

6

Muhtemelen bir jsonp çözümüne ihtiyacınız var:

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

JQuery kullanıyorsanız:

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

NPM modülü depoları , bazı kullanıcı veya grup için tüm genel depoların JSON'unu alır. Bunu doğrudan üzerinden çalıştırabilirsiniz, npxböylece herhangi bir şey yüklemenize gerek kalmaz, sadece bir kuruluş veya kullanıcı seçin (burada "W3C"):

$ npx repos W3C W3Crepos.json

Bu, W3Crepos.json adlı bir dosya oluşturacaktır. Grep, örneğin depoların listesini getirecek kadar iyidir:

$ grep full_name W3Crepos.json

artıları:

  • 100'den fazla repo ile çalışır (bu sorunun birçok cevabı yoktur).
  • Yazacak pek bir şey yok.

Eksileri:

  • Gerektirir npx(veya npmgerçekten yüklemek istiyorsanız).

3

Python kullanarak bir GitHub kullanıcısının tüm genel depolarının listesini alın:

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

Referans


1
bu çalışmıyor (belki daha eski api sürümü için)
OzzyCzech

2
evet, küçük bir değişiklik var. Cevabımı düzenledim ve şimdi iyi çalışıyor.
darshanc99

3

Artık harika GraphQL API Explorer'ı kullanma seçeneği var .

Kuruluşumun tüm aktif depolarının kendi dilleriyle birlikte bir listesini istedim. Bu sorgu tam olarak şunu yapar:

{
  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

Bir kuruluşun depolarını arıyorsanız-

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

Misal:

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

Ayrıca, sayfalandırma sorunu olması durumunda tüm adları almak için per_page parametresini ekleyebilirsiniz.

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

3

İşte repos API'sinin tam bir özelliği:

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

GET /users/:username/repos

Sorgu Dizesi Parametreleri:

İlk 5, yukarıdaki API bağlantısında belgelenmiştir. İçin parametreler pageve per_pagebaşka yerlerde belgelenmiş ve tam açıklaması faydalıdır edilir.

  • type(dize): biri olabilir all, owner, member. Varsayılan:owner
  • sort(dize): biri olabilir created, updated, pushed, full_name. Varsayılan:full_name
  • direction(string): ascveya değerlerinden biri olabilir desc. Varsayılan: asckullanırken full_name, aksi haldedesc
  • page (tamsayı): Geçerli sayfa
  • per_page (tamsayı): sayfa başına kayıt sayısı

Bu bir HTTP GET API olduğundan, cURL'ye ek olarak, bunu tarayıcıda da deneyebilirsiniz. Örneğin:

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


2

HTML

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

JavaScript

// Github depoları

Depo listesini sınırlamak istiyorsanız, hemen ?per_page=3sonrasına ekleyebilirsiniz username/repos.

Örneğin username/repos?per_page=3

/ username/ Yerine herhangi bir kişinin kullanıcı adını Github'a koyabilirsiniz.

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

Sayfalama JSON

Aşağıdaki JS kodu bir konsolda kullanılmak üzere tasarlanmıştır.

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

Cevap "/ users /: user / repo", ancak bunu bir sunucuda bir web uygulamasını ayağa kaldırmak için kullanabileceğiniz açık kaynaklı bir projede yapan tüm koda sahibim.

Tüm depoları listeleyen GitHub API ile iletişim kuran Git-Captain adlı bir GitHub projesi oluşturdum.

Çok sayıda GitHub deposunda bir şube bulmak, oluşturmak ve silmek için GitHub API kullanan Node.js ile oluşturulmuş açık kaynaklı bir web uygulamasıdır.

Kuruluşlar için veya tek bir kullanıcı için kurulabilir.

Beni oku'da da nasıl ayarlayacağımı adım adım anlatıyorum.


1

Kullanıcının 100 genel kod deposunun url'sini almak için:

$.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
daha fazla ayrıntı için git docs-> developer.github.com/v3/repos
Vishal Kank

1
SO'ya hoş geldiniz! Lütfen göndermeden önce bunu kontrol edin ... Bir yanıt gönderdiğinizde ve daha fazlası olduğunda, POV'unuzun Artılarını gösterin ve lütfen, sadece posta kodu göndermeyin, biraz açıklayın.
David García Bodego
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.