Bagaimana cara mendapatkan kembali daftar semua repositori GitHub seseorang?


90

Kami sedang mengerjakan proyek di mana kami perlu menampilkan semua proyek seseorang di repositori di akun GitHub.

Adakah yang bisa menyarankan, bagaimana cara menampilkan nama semua repositori git orang tertentu menggunakan nama pengguna gitnya?

Jawaban:



39

Gunakan Github API :

/users/:user/repos

Ini akan memberi Anda semua repositori publik pengguna. Jika Anda perlu mengetahui repositori pribadi, Anda perlu mengautentikasi sebagai pengguna tertentu. Anda kemudian dapat menggunakan panggilan REST:

/user/repos

untuk menemukan semua repositori pengguna.

Untuk melakukan ini dengan Python, lakukan sesuatu seperti:

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

Dimana url yang diteruskan ke fungsi tersebut adalah url REST seperti pada contoh di atas. Jika Anda tidak perlu mengautentikasi, cukup ubah metode untuk menghapus penambahan header Otorisasi. Anda kemudian bisa mendapatkan url api publik menggunakan permintaan GET sederhana.


27
Ini hanya akan memberikan "halaman" pertama dari set hasil, yang ditetapkan pada 30 item secara default. Anda dapat menggunakan ?per_page=100untuk mendapatkan jumlah maksimum tetapi jika pengguna memiliki lebih dari seratus repo, Anda harus mengikuti beberapa nextURL di Linkheader HTTP yang dikirim dengan respons.
Potherca

2
Terima kasih @Potherca, apa yang saya cari!
aknuds1

33

Coba curlperintah berikut untuk mendaftar repositori:

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

Untuk membuat daftar URL yang digandakan, jalankan:

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

Jika itu pribadi, Anda perlu menambahkan kunci API Anda ( access_token=GITHUB_API_TOKEN), misalnya:

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

Jika pengguna adalah organisasi, gunakan /orgs/:username/repossebagai gantinya, untuk mengembalikan semua repositori.

Untuk mengkloningnya, lihat: Bagaimana cara mengkloning semua repo sekaligus dari GitHub?

Lihat juga: Cara mengunduh GitHub Release dari repo pribadi menggunakan baris perintah


9
Ini hanya menampilkan 100 repositori pertama, terlepas dari per_page=1000.
jm666

2
Tambahkan -sopsi ke curlperintah Anda untuk menyingkirkan bilah kemajuan yang tidak sedap dipandang itu, seperti dalamcurl -s ...
xmnboy

5
Seperti yang dikatakan @ jm666, ukuran halaman maksimum adalah 100. Untuk melihat halaman kedua, lakukan: curl " api.github.com/users/$USER/repos?per_page=100 \ & page = 2"
rscohn2

2
Contoh privat tidak akan bekerja dengan contoh, / users / "in plural" hanya mengembalikan repo publik. Anda harus menggunakan api.github.com/user/repos dan menambahkan token ke dalam permintaan untuk mendapatkan yang pribadi.
LeandroCR

2
Misteri @kenorb terpecahkan, pengguna adalah org jadi /orgs/:username/reposkembalikan semua repo, /users/...kembalikan sebagian, ini memang aneh. nama pengguna dapat diperlakukan sebagai pengguna atau organisasi.
ios pelajar

11

Jika Anda memiliki jq terinstal, Anda dapat menggunakan perintah berikut untuk membuat daftar semua repo publik pengguna

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

6

Anda mungkin membutuhkan solusi jsonp:

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

Jika Anda menggunakan 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

Repos modul NPM mengambil JSON untuk semua repo publik untuk beberapa pengguna atau grup. Anda dapat menjalankan ini langsung dari npxsehingga Anda tidak perlu menginstal apa pun, cukup pilih org atau pengguna ("W3C" di sini):

$ npx repos W3C W3Crepos.json

Ini akan membuat file bernama W3Crepos.json. Grep cukup baik untuk misalnya mengambil daftar repo:

$ grep full_name W3Crepos.json

kelebihan:

  • Bekerja dengan lebih dari 100 repo (banyak jawaban untuk pertanyaan ini tidak).
  • Tidak banyak yang bisa diketik.

kontra:

  • Membutuhkan npx(atau npmjika Anda ingin menginstalnya secara nyata).

3

Ambil daftar semua repositori publik pengguna GitHub menggunakan 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")

Referensi


1
ini tidak berfungsi (mungkin untuk versi api yang lebih lama)
OzzyCzech

2
ya, ada perubahan kecil. Saya telah mengedit jawaban saya, dan sekarang berfungsi dengan baik.
darshanc99

3

Sekarang ada opsi untuk menggunakan GraphQL API Explorer yang mengagumkan .

Saya ingin daftar semua repositori aktif organisasi saya dengan bahasanya masing-masing. Kueri ini hanya melakukan itu:

{
  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

Jika mencari repo dari suatu organisasi-

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

Contoh:

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

Anda juga bisa menambahkan parameter per_page untuk mendapatkan semua nama kalau-kalau ada masalah pagination-

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

3

Berikut adalah spesifikasi lengkap untuk API repos:

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

GET /users/:username/repos

Parameter String Kueri:

5 yang pertama didokumentasikan dalam tautan API di atas. Parameter untuk pagedan per_pageyang didokumentasikan di tempat lain dan berguna dalam deskripsi lengkap.

  • type(string): Bisa menjadi salah satu all, owner, member. Default:owner
  • sort(string): Bisa menjadi salah satu created, updated, pushed, full_name. Default:full_name
  • direction(string): Bisa salah satu dari ascatau desc. Default: ascsaat menggunakan full_name, sebaliknyadesc
  • page (integer): Halaman saat ini
  • per_page (integer): jumlah record per halaman

Karena ini adalah HTTP GET API, selain cURL, Anda dapat mencobanya di browser. Sebagai contoh:

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


2

HTML

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

JavaScript

// Repo Github

Jika Anda ingin membatasi daftar repositori, Anda dapat menambahkan ?per_page=3setelahnya username/repos.

misalnya username/repos?per_page=3

Sebagai ganti / username/, Anda dapat memasukkan nama pengguna siapa pun di 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

Kode JS di bawah ini dimaksudkan untuk digunakan di konsol.

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

Jawabannya adalah "/ users /: user / repo", tetapi saya memiliki semua kode yang melakukan ini dalam proyek sumber terbuka yang dapat Anda gunakan untuk membuat aplikasi web di server.

Saya mendukung proyek GitHub bernama Git-Captain yang berkomunikasi dengan GitHub API yang mencantumkan semua repo.

Ini adalah aplikasi web sumber terbuka yang dibangun dengan Node.js menggunakan GitHub API untuk menemukan, membuat, dan menghapus cabang di banyak repositori GitHub.

Ini dapat disiapkan untuk organisasi atau satu pengguna.

Saya punya step-by-step cara mengaturnya juga di read-me.


1

Untuk mendapatkan url 100 repositori publik pengguna:

$.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
untuk detail lebih lanjut kunjungi git docs-> developer.github.com/v3/repos
Vishal Kank

1
Selamat datang di SO! Harap periksa ini sebelum memposting ... Ketika Anda memposting jawaban dan ada jawaban lainnya, tunjukkan Kelebihan POV Anda dan, tolong, jangan hanya kode pos, jelaskan sedikit.
David GarcĂ­a Bodego
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.