Як отримати список усіх сховищ GitHub людини?


90

Ми працюємо над проектом, де нам потрібно відобразити всі проекти людини в його сховищі на акаунті GitHub.

Хтось може запропонувати, як я можу відобразити імена всіх сховищ git конкретної людини, використовуючи його ім'я користувача git?

Відповіді:


63

Для цього ви можете використовувати github api . Якщо натиснути, https://api.github.com/users/USERNAME/reposз’явиться список загальнодоступних сховищ для користувача USERNAME .


6
Ви також можете вибрати, скільки репо ви отримаєте з ?per_page= developer.github.com/v3/#pagination
OzzyCzech

1
api.github.com/users/USERNAME/repos?page=1 дає першу сторінку результатів. (змінити 1 на 2 і так далі, за замовчуванням 30 результатів на сторінку)
stevec

39

Використовуйте API Github :

/users/:user/repos

Це дасть вам усі загальнодоступні сховища користувача. Якщо вам потрібно знайти приватні сховища, вам потрібно буде автентифікуватися як конкретний користувач. Потім ви можете використовувати виклик REST:

/user/repos

щоб знайти всі репозиторії користувача.

Для цього в Python зробіть щось на зразок:

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

Де URL-адреса, передана функції, є REST-адресою, як у прикладах вище. Якщо вам не потрібно автентифікуватися, просто змініть метод, щоб видалити додавання заголовка авторизації. Потім ви можете отримати будь-яку загальнодоступну URL-адресу API, використовуючи простий запит GET.


27
Це дасть лише першу "сторінку" набору результатів, який за замовчуванням встановлюється на 30 елементів. Ви можете використовувати ?per_page=100для отримання максимальної суми, але якщо у користувача більше сотні репозиторіїв, вам потрібно буде перейти за кількома nextURL-адресами в Linkзаголовку HTTP, що надсилається із відповіддю.
Potherca

2
Дякую @Potherca, саме те, що я шукав!
aknuds1

33

Спробуйте curlвиконати таку команду, щоб перерахувати сховища:

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

Щоб переглянути клоновані URL-адреси, запустіть:

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

Якщо він приватний, вам потрібно додати свій ключ API ( access_token=GITHUB_API_TOKEN), наприклад:

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

Якщо користувач є організацією, використовуйте /orgs/:username/reposзамість цього, щоб повернути всі сховища.

Щоб клонувати їх, див .: Як клонувати відразу всі репозиторії з GitHub?

Дивіться також: Як завантажити GitHub Release з приватного репозиторію за допомогою командного рядка


9
Тут показано лише перші 100 сховищ, незалежно від per_page=1000.
jm666

2
Додайте -sопцію до своєї curlкоманди, щоб позбутися тих непривабливих індикаторів прогресу, як уcurl -s ...
xmnboy

5
Як говорить @ jm666, максимальний розмір сторінки - 100. Щоб побачити 2-ю сторінку, зробіть: curl " api.github.com/users/$USER/repos?per_page=100 \ & page = 2"
rscohn2

2
Приватний приклад не працюватиме з прикладом, / users / "у множині" повертає лише загальнодоступні репозиторії. Вам потрібно перейти на api.github.com/user/repos і додати маркер у запит, щоб отримати приватні.
LeandroCR

2
@kenorb таємниця розгадана, користувач є організацією, тому /orgs/:username/reposповерніть усі репозиторії, /users/...поверніть їх частину, це справді дивно. ім'я користувача може розглядатися як як користувач, так і як організація.
ios

11

Якщо у вас встановлений jq , ви можете використати таку команду, щоб перерахувати всі загальнодоступні репозиторії користувача

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

6

Ймовірно, вам потрібне рішення jsonp:

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

Якщо ви використовуєте 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

РЕПО модулі NPM захоплюють JSON для всіх загальнодоступних РЕПО для певного користувача або групи. Ви можете запустити це безпосередньо з, npxтому вам не потрібно нічого встановлювати, просто виберіть організацію або користувача ("W3C" тут):

$ npx repos W3C W3Crepos.json

Це створить файл із назвою W3Crepos.json. Grep досить хороший, щоб, наприклад, отримати список репозиторіїв:

$ grep full_name W3Crepos.json

плюси:

  • Працює з більш ніж 100 репозиторіями (багато відповідей на це питання не роблять).
  • Мало друкувати.

мінуси:

  • Потрібно npx(або npmякщо ви хочете встановити його по-справжньому).

3

Отримати список усіх загальнодоступних сховищ користувача GitHub за допомогою 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")

Довідково


1
це не працює (можливо, це для старшої версії api)
OzzyCzech

2
так, є невелика зміна. Я відредагував свою відповідь, і зараз вона працює добре.
darshanc99

3

Тепер є можливість використовувати чудовий Провідник API GraphQL .

Я хотів отримати список усіх активних репозиторіїв моєї організації з відповідними мовами. Цей запит робить саме це:

{
  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

Якщо ви шукаєте репо організації

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

Приклад:

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

Також ви можете додати параметр per_page, щоб отримати всі імена на випадок, якщо є проблема з пагінацією -

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

3

Ось повна специфікація для repos API:

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

GET /users/:username/repos

Параметри рядка запиту:

Перші 5 задокументовані в посиланні на API вище. Параметри pageі per_pageякі задокументовані в іншому місці та корисні в повному описі.

  • type(Рядок): Може бути один з all, owner, member. За замовчуванням:owner
  • sort(Рядок): Може бути один з created, updated, pushed, full_name. За замовчуванням:full_name
  • direction(рядок): Може бути одним із ascабо desc. За замовчуванням: ascпід час використання full_name, інакшеdesc
  • page (ціле число): поточна сторінка
  • per_page (ціле число): кількість записів на сторінці

Оскільки це HTTP GET API, на додаток до cURL, ви можете спробувати це просто у браузері. Наприклад:

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


2

HTML

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

JavaScript

// Репозиторії Github

Якщо ви хочете обмежити список сховищ, ви можете просто додати ?per_page=3після username/repos.

напр username/repos?per_page=3

Замість / username/ ви можете розмістити ім’я користувача будь-якої людини на 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

Наведений нижче код JS призначений для використання в консолі.

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

Відповідь: "/ users /: user / repo", але у мене є весь код, який робить це, у проекті з відкритим кодом, який ви можете використовувати для виходу веб-програми на сервер.

Я підтримав проект GitHub під назвою Git-Captain, який взаємодіє з API GitHub, що містить усі репозиторії.

Це веб-програма з відкритим кодом, побудована на Node.js з використанням API GitHub для пошуку, створення та видалення гілки у численних сховищах GitHub.

Це може бути налаштовано для організацій або одного користувача.

У мене є покрокова інструкція, як це налаштувати у програмі читання.


1

Щоб отримати URL-адресу 100 відкритих сховищ користувача:

$.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
для більш детальної інформації відвідайте git docs-> developer.github.com/v3/repos
Vishal Kank

1
Ласкаво просимо до SO! Будь ласка, перевірте це перед публікацією ... Коли ви опублікуєте відповідь і є ще кілька, покажіть плюси вашого POV і, будь ласка, не просто поштовий індекс, поясніть це трохи.
Девід Гарсія Бодего
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.