Как получить список всех репозиториев GitHub человека?
Мы работаем над проектом, в котором нам нужно отобразить все проекты человека в его репозитории на аккаунте GitHub.
Кто-нибудь может подсказать, как я могу отобразить имена всех git-репозиториев конкретного человека, используя его имя пользователя git?
24 ответа
Вы можете использовать GitHub API для этого. Удары https://api.github.com/users/username/repos
будет перечислять публичные репозитории этого пользователя.
Используйте 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-адрес, переданный функции, является REST-адресом, как в приведенных выше примерах. Если вам не нужно проходить аутентификацию, просто измените метод, чтобы удалить добавление заголовка авторизации. Затем вы можете получить любой общедоступный URL-адрес API с помощью простого запроса GET.
Попробуйте следующее 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
Чтобы клонировать их, смотрите: Как клонировать все репо сразу из GitHub?
Смотрите также: Как скачать GitHub Release из частного репозитория с помощью командной строки
Вы также можете использовать для этого новый модный github cli :
$ gh api users/:owner/repos
Он также распечатает вывод, что сделает его более читаемым.
Вот полная спецификация API репозиториев:
https://developer.github.com/v3/repos/
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
Если у вас установлен jq, вы можете использовать следующую команду, чтобы просмотреть все публичные репозитории пользователя.
curl -s https://api.github.com/users/<username>/repos | jq '.[]|.html_url'
Вам, вероятно, нужно решение 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>
Модуль NPM РЕПО хватает JSON для всех публичных сделок РЕПО для некоторого пользователя или группы. Вы можете запустить это прямо изnpx
поэтому вам не нужно ничего устанавливать, просто выберите организацию или пользователя (здесь "W3C"):
$ npx repos W3C W3Crepos.json
Это создаст файл с именем W3Crepos.json. Grep достаточно хорош, например, для получения списка репозиториев:
$ grep full_name W3Crepos.json
плюсы:
- Работает с более чем 100 репозиториями (многие ответы на этот вопрос - нет).
- Не много печатать.
минусы:
- Требуется
npx
(илиnpm
если хотите установить по-настоящему).
Теперь есть возможность использовать замечательный 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
}
}
}
}
}
Получите список всех публичных репозиториев пользователя 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")
Если вы ищете репо организации -
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
Используя Python:
import requests
link = ('https://api.github.com/users/{USERNAME}/repos')
api_link = requests.get(link)
api_data = api_link.json()
repos_Data = (api_data)
repos = []
[print(f"- {items['name']}") for items in repos_Data]
Если вы хотите получить все репозитории в списке (массиве), вы можете сделать что-то вроде этого:
import requests
link = ('https://api.github.com/users/{USERNAME}/repos')
api_link = requests.get(link)
api_data = api_link.json()
repos_Data = (api_data)
repos = []
[repos.append(items['name']) for items in repos_Data]
Это сохранит все репозитории в массиве repos.
Пейджинг 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)
})
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();
Ответ "/users/:user/repo", но у меня есть весь код, который делает это в проекте с открытым исходным кодом, который вы можете использовать для установки веб-приложения на сервере.
Я поддержал проект GitHub под названием Git-Captain, который связывается с GitHub API, в котором перечислены все репозитории.
Это веб-приложение с открытым исходным кодом, созданное с использованием Node.js и использующее GitHub API для поиска, создания и удаления ветки в многочисленных репозиториях GitHub.
Это может быть настройка для организаций или одного пользователя.
У меня есть пошаговая инструкция по настройке в read-me.
Использование Javascript Fetch
async function getUserRepos(username) {
const repos = await fetch(`https://api.github.com/users/${username}/repos`);
return repos;
}
getUserRepos("[USERNAME]")
.then(repos => {
console.log(repos);
});
Пейджинговый Баш
Вставьте свой токен в файл с именемgithub_token_file
и дайте ему разрешения0400
.
GITHUB_TOKEN=$(cat github_token_file)
USER=myuser
page=1
while : ; do
echo Page $page
result=$(curl --header "authorization: Bearer $GITHUB_TOKEN" "https://api.github.com/user/repos?per_page=100&page=$page")
echo $result | jq '.[].name' | sort
wc=$(echo $result | wc -w)
[[ $wc -lt "10" ]] && break || true
page=$((page+1))
done
Обратите внимание, что с помощью/users/<username>/repos
вы заходите только в публичные репозитории, в то время как/user/repos
поражает как общественное, так и частное лицо.
Чтобы получить 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>
Немного улучшенная версия ответа @joelazar в виде очищенного списка:
gh repo list <owner> -L 400 |awk '{print $1}' |sed "s/<owner>\///"
Разумеется, заменить на имя владельца.
Это также может получить списки с> 100 репозиториями (в данном случае 400)
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!');
}
});
Немного более запоминающиеся (упрощенные) версии этого ответа (проголосовали за), чтобы получить публичные репозитории (только):
# quick way to get all (up to 100) public repos for user mirekphd
$ curl -s "https://api.github.com/users/mirekphd/repos?per_page=100" | grep full_name | sort
Текущий метод получения всех (до 100) частных репозиториев из Github API (см. документы этот ): и ответ
# get all private repos from the Github API
# after logging with Personal Access Token (assuming secure 2FA is used)
$ export GITHUB_USER=mirekphd && export GITHUB_TOKEN=$(cat <path_redacted>/personal-github-token) && curl -s --header "Authorization: Bearer $GITHUB_TOKEN" --request GET "https://api.github.com/search/repositories?q=user:$GITHUB_USER&per_page=100" | grep "full_name" | sort
И если вы хотите перечислить имена репо, отфильтрованные по определенной теме:
gh search repos --owner=<org> --topic=payments --json name --jq ".[].name" --limit 200
Просто сделайте это в почтальоне. Таким образом, вы можете визуализировать его, запускать скрипты и т. д.
Проверьте это.
https://learning.postman.com/docs/sending-requests/visualizer/
Используя официальный инструмент командной строки GitHub :
gh auth login
gh api graphql --paginate -f query='
query($endCursor: String) {
viewer {
repositories(first: 100, after: $endCursor) {
nodes { nameWithOwner }
pageInfo {
hasNextPage
endCursor
}
}
}
}
' | jq ".[] | .viewer | .repositories | .nodes | .[] | .nameWithOwner"
Примечание : сюда будут включены все ваши общедоступные, частные и чужие репозитории, к которым вам предоставлен доступ.
Рекомендации: