Làm thế nào để truy xuất danh sách tất cả các kho lưu trữ GitHub của một người?


90

Chúng tôi đang thực hiện một dự án mà chúng tôi cần hiển thị tất cả các dự án của một người trong kho lưu trữ của anh ấy trên tài khoản GitHub.

Bất cứ ai có thể đề xuất, làm thế nào tôi có thể hiển thị tên của tất cả các kho lưu trữ git của một người cụ thể bằng cách sử dụng tên người dùng git của anh ta?

Câu trả lời:


63

Bạn có thể sử dụng github api cho việc này. Việc đánh https://api.github.com/users/USERNAME/repossẽ liệt kê các kho lưu trữ công khai cho người dùng USERNAME .


6
bạn cũng có thể chọn số lượng repos bạn nhận được với ?per_page= developer.github.com/v3/#pagination
OzzyCzech

1
api.github.com/users/USERNAME/repos?page=1 đưa ra trang kết quả đầu tiên. (thay đổi 1 thành 2, v.v., mặc định là 30 kết quả mỗi trang)
stevec

39

Sử dụng API Github :

/users/:user/repos

Điều này sẽ cung cấp cho bạn tất cả các kho lưu trữ công khai của người dùng. Nếu bạn cần tìm ra kho lưu trữ riêng tư, bạn sẽ cần xác thực là người dùng cụ thể. Sau đó, bạn có thể sử dụng cuộc gọi REST:

/user/repos

để tìm tất cả các repo của người dùng.

Để làm điều này trong Python, hãy làm như sau:

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

Trong đó url được chuyển vào hàm là url REST như trong các ví dụ trên. Nếu bạn không cần xác thực thì chỉ cần sửa đổi phương pháp để loại bỏ việc thêm tiêu đề Ủy quyền. Sau đó, bạn có thể nhận bất kỳ url api công khai nào bằng cách sử dụng yêu cầu GET đơn giản.


27
Điều này sẽ chỉ cung cấp cho "trang" đầu tiên của tập kết quả, được đặt ở 30 mục theo mặc định. Bạn có thể sử dụng ?per_page=100để nhận được số tiền tối đa nhưng nếu người dùng có hơn một trăm repo, bạn sẽ cần theo dõi một số nextURL trong Linktiêu đề HTTP gửi kèm theo phản hồi.
Potherca

2
Cảm ơn @Potherca, đúng là những gì tôi đang tìm kiếm!
aknuds1

33

Hãy thử curllệnh sau để liệt kê các kho:

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

Để liệt kê các URL được sao chép, hãy chạy:

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

Nếu là riêng tư, bạn cần thêm khóa API của mình ( access_token=GITHUB_API_TOKEN), ví dụ:

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

Nếu người dùng là tổ chức, hãy sử dụng /orgs/:username/reposthay thế, để trả lại tất cả các kho.

Để sao chép chúng, hãy xem: Làm thế nào để sao chép tất cả các đại diện cùng một lúc từ GitHub?

Xem thêm: Cách tải GitHub Release từ repo riêng tư bằng dòng lệnh


9
Điều này chỉ hiển thị 100 kho lưu trữ đầu tiên, bất kể per_page=1000.
jm666

2
Thêm -stùy chọn để bạn curllệnh để thoát khỏi những thanh tiến trình khó coi, như trongcurl -s ...
xmnboy

5
Như @ jm666 cho biết, kích thước trang tối đa là 100. Để xem trang thứ 2, hãy thực hiện: curl " api.github.com/users/$USER/repos?per_page=100 \ & page = 2"
rscohn2

2
Ví dụ riêng tư sẽ không hoạt động với ví dụ này, / users / "in plural" chỉ trả về các repo công khai. Bạn cần truy cập api.github.com/user/repos và thêm mã thông báo vào yêu cầu để nhận các mã riêng tư.
LeandroCR

2
Bí ẩn @kenorb đã được giải quyết, người dùng là tổ chức nên /orgs/:username/repostrả lại tất cả các repo, /users/...trả lại một phần của chúng, điều này quả thực là kỳ lạ. tên người dùng có thể được coi là người dùng hoặc tổ chức.
ios learningner

11

Nếu bạn đã cài đặt jq , bạn có thể sử dụng lệnh sau để liệt kê tất cả các kho lưu trữ công khai của người dùng

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

6

Bạn có thể cần một giải pháp jsonp:

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

Nếu bạn sử dụng 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

Các module NPM Repos grabs JSON cho tất cả các hợp đồng mua công đối với một số người dùng hoặc nhóm. Bạn có thể chạy điều này trực tiếp từ npxđó, do đó bạn không cần cài đặt bất kỳ thứ gì chỉ cần chọn một tổ chức hoặc người dùng ("W3C" tại đây):

$ npx repos W3C W3Crepos.json

Thao tác này sẽ tạo một tệp có tên W3Crepos.json. Grep đủ tốt để lấy danh sách các repo:

$ grep full_name W3Crepos.json

ưu điểm:

  • Hoạt động với hơn 100 repo (nhiều câu trả lời cho câu hỏi này thì không).
  • Không có nhiều để gõ.

khuyết điểm:

  • Yêu cầu npx(hoặc npmnếu bạn muốn cài đặt nó thật).

3

Truy xuất danh sách tất cả các kho lưu trữ công khai của người dùng GitHub bằng 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")

Tài liệu tham khảo


1
điều này không hoạt động (có thể nó dành cho phiên bản api cũ hơn)
OzzyCzech

2
vâng, có một thay đổi nhỏ. Tôi đã chỉnh sửa câu trả lời của mình và bây giờ nó hoạt động tốt.
darshanc99

3

Bây giờ có một tùy chọn để sử dụng Trình khám phá API GraphQL tuyệt vời .

Tôi muốn có một danh sách tất cả các đại diện đang hoạt động của tổ chức của tôi với các ngôn ngữ tương ứng của họ. Truy vấn này thực hiện điều đó:

{
  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

Nếu tìm kiếm đại diện của một tổ chức-

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

Thí dụ:

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

Ngoài ra, bạn có thể thêm tham số per_page để lấy tất cả các tên trong trường hợp có vấn đề về phân trang-

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

3

Đây là thông số kỹ thuật đầy đủ cho API repos:

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

GET /users/:username/repos

Tham số chuỗi truy vấn:

5 đầu tiên được ghi lại trong liên kết API ở trên. Các tham số cho pageper_pageđược ghi ở nơi khác và hữu ích trong mô tả đầy đủ.

  • type(string): Có thể là một trong những all, owner, member. Mặc định:owner
  • sort(string): Có thể là một trong những created, updated, pushed, full_name. Mặc định:full_name
  • direction(string): Có thể là một trong aschoặc desc. Mặc định: asckhi sử dụng full_name, nếu khôngdesc
  • page (số nguyên): Trang hiện tại
  • per_page (số nguyên): số bản ghi trên mỗi trang

Vì đây là một API GET HTTP, ngoài cURL, bạn có thể thử điều này một cách đơn giản trong trình duyệt. Ví dụ:

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


2

HTML

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

JavaScript

// Github repos

Nếu bạn muốn giới hạn danh sách kho, bạn có thể thêm ?per_page=3vào sau username/repos.

ví dụ username/repos?per_page=3

Thay vì / username/, bạn có thể đặt tên người dùng của bất kỳ người nào trên 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

JSON phân trang

Mã JS bên dưới được sử dụng trong bảng điều khiển.

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

Câu trả lời là "/ users /: user / repo", nhưng tôi có tất cả mã thực hiện điều này trong một dự án nguồn mở mà bạn có thể sử dụng để tạo ứng dụng web trên máy chủ.

Tôi đã lập một dự án GitHub có tên Git-Captain giao tiếp với API GitHub liệt kê tất cả các repo.

Đó là một ứng dụng web mã nguồn mở được xây dựng với Node.js sử dụng API GitHub để tìm, tạo và xóa một nhánh trong nhiều kho lưu trữ GitHub.

Nó có thể được thiết lập cho các tổ chức hoặc một người dùng duy nhất.

Tôi có hướng dẫn từng bước để thiết lập nó trong phần read-me.


1

Để lấy url của 100 kho lưu trữ công khai của người dùng:

$.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
để biết thêm chi tiết, hãy truy cập git docs-> developer.github.com/v3/repos
Vishal Kank vào

1
Chào mừng đến với SO! Vui lòng kiểm tra điều này trước khi đăng ... Khi bạn đăng câu trả lời và còn một số câu trả lời khác, hãy hiển thị Ưu điểm của POV của bạn và vui lòng không chỉ đăng mã, hãy giải thích một chút.
David García Bodego
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.