Как получить список всех репозиториев 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 результатов на страницу)
Стивек

39

Используйте Github API :

/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-адрес, переданный в функцию, является URL-адресом REST, как в приведенных выше примерах. Если вам не нужна аутентификация, просто измените метод, чтобы удалить добавление заголовка авторизации. Затем вы можете получить любой общедоступный URL-адрес API, используя простой запрос GET.


27
Это даст только первую «страницу» результирующего набора, который по умолчанию равен 30 элементам. Вы можете использовать ?per_page=100для получения максимального количества, но если у пользователя более сотни репозиториев, вам нужно будет следовать нескольким nextURL-адресам в HTTP- Linkзаголовке, отправленном с ответом.
Potherca

2
Спасибо @Potherca, именно то, что я искал!
aknuds1 03

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 из частного репо с помощью командной строки


9
Это показывает только первые 100 репозиториев, независимо от расширения per_page=1000.
jm666

2
Добавьте в -sсвою curlкоманду опцию, чтобы избавиться от этих неприглядных индикаторов выполнения, как вcurl -s ...
xmnboy

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

2
Частный пример не будет работать с примером, / users / "во множественном числе" возвращает только общедоступные репозитории. Вам нужно перейти с api.github.com/user/repos и добавить токен в запрос, чтобы получить частные.
LeandroCR 04

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

Теперь есть возможность использовать замечательный GraphQL API Explorer .

Мне нужен список всех активных репозиториев моей организации с соответствующими языками. Этот запрос делает именно это:

{
  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

Вот полная спецификация 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 и использующее GitHub API для поиска, создания и удаления ветки во многих репозиториях GitHub.

Его можно настроить для организаций или одного пользователя.

У меня есть пошаговая инструкция по настройке в read-me.


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! Пожалуйста, проверьте это перед публикацией ... Когда вы отправляете ответ, а есть еще несколько, покажите плюсы своей точки зрения и, пожалуйста, не просто публикуйте код, объясните его немного.
Дэвид Гарсия Бодего
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.