Como recuperar a lista de todos os repositórios GitHub de uma pessoa?

94

Estamos trabalhando em um projeto onde precisamos exibir todos os projetos de uma pessoa em seu repositório na conta GitHub.

Alguém pode sugerir, como posso exibir os nomes de todos os repositórios git de uma pessoa em particular usando seu nome de usuário git?

user1127981
fonte

Respostas:

67

Você pode usar o github api para isso. Bater https://api.github.com/users/USERNAME/reposlistará os repositórios públicos para o usuário USERNAME .

Frederick Cheung
fonte
7
você também pode escolher quanto repos obterá com ?per_page= developer.github.com/v3/#pagination
OzzyCzech
1
api.github.com/users/USERNAME/repos?page=1 fornece a primeira página de resultados. (altere 1 para 2 e assim por diante, o padrão é 30 resultados por página)
stevec
40

Use a API Github :

/users/:user/repos

Isso lhe dará todos os repositórios públicos do usuário. Se você precisar descobrir repositórios privados, você precisará se autenticar como o usuário específico. Você pode então usar a chamada REST:

/user/repos

para encontrar todos os repositórios do usuário.

Para fazer isso em Python, faça algo como:

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

Onde o url passado para a função é o url REST, como nos exemplos acima. Se você não precisa se autenticar, simplesmente modifique o método para remover a adição do cabeçalho de autorização. Você pode obter qualquer URL de API público usando uma simples solicitação GET.

BeRecursive
fonte
27
Isso fornecerá apenas a primeira "página" do conjunto de resultados, que é definido como 30 itens por padrão. Você pode usar ?per_page=100para obter a quantidade máxima, mas se um usuário tiver mais de cem repositórios, você precisará seguir vários nextURLs no Linkcabeçalho HTTP enviado com a resposta.
Potherca de
2
Obrigado @Potherca, exatamente o que eu estava procurando!
aknuds1
34

Tente o seguinte curlcomando para listar os repositórios:

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

Para listar URLs clonados, execute:

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

Se for privado, você precisa adicionar sua chave de API ( access_token=GITHUB_API_TOKEN), por exemplo:

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

Se o usuário for uma organização, use /orgs/:username/repos, em vez disso, para retornar todos os repositórios.

Para cloná-los, consulte: Como clonar todos os repos de uma vez no GitHub?

Veja também: Como baixar a versão do GitHub do repositório privado usando a linha de comando

Kenorb
fonte
9
Isso mostra apenas os primeiros 100 repositórios, independentemente do per_page=1000.
jm666
2
Adicione a -sopção ao seu curlcomando para se livrar daquelas barras de progresso feias, como emcurl -s ...
xmnboy
5
Como @ jm666 afirma, o tamanho máximo da página é 100. Para ver a 2ª página, faça: curl " api.github.com/users/$USER/repos?per_page=100 \ & page = 2"
rscohn2
2
O exemplo privado não funcionará com o exemplo, / users / "no plural" retorna apenas repositórios públicos. Você precisa acessar api.github.com/user/repos e adicionar o token à solicitação para obter os privados.
LeandroCR
2
@kenorb mistério resolvido, o usuário é uma organização, então /orgs/:username/reposdevolva todos os repositórios, /users/...devolva parte deles, isso é realmente estranho. o nome de usuário pode ser tratado como um usuário ou uma organização.
ios learner
11

Se você tiver o jq instalado, você pode usar o seguinte comando para listar todos os repositórios públicos de um usuário

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

Você provavelmente precisa de uma solução jsonp:

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

Se você usa 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>

Blackmiaool
fonte
3

O módulo NPM repos pega o JSON para todos os repositórios públicos para algum usuário ou grupo. Você pode executar isso diretamente de npxpara que não precise instalar nada, basta escolher uma organização ou usuário ("W3C" aqui):

$ npx repos W3C W3Crepos.json

Isso criará um arquivo chamado W3Crepos.json. Grep é bom o suficiente para, por exemplo, buscar a lista de repositórios:

$ grep full_name W3Crepos.json

prós:

  • Funciona com mais de 100 repositórios (muitas respostas a esta pergunta não).
  • Não há muito para digitar.

contras:

  • Requer npx(ou npmse você quiser instalá-lo de verdade).
ericP
fonte
3

Recupere a lista de todos os repositórios públicos de um usuário GitHub usando 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")

Referência

darshanc99
fonte
1
isso não está funcionando (talvez seja para uma versão api mais antiga)
OzzyCzech
2
sim, há uma pequena mudança. Eu editei minha resposta e agora ela funciona bem.
darshanc99
3

Agora existe a opção de usar o incrível GraphQL API Explorer .

Eu queria uma lista de todos os repositórios ativos da minha organização com seus respectivos idiomas. Esta consulta faz exatamente isso:

{
  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
        }
      }
    }
  }
}

Pavel Brodsky
fonte
3

Se estiver procurando por repos de uma organização-

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

Exemplo:

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

Além disso, você pode adicionar o parâmetro per_page para obter todos os nomes, caso haja um problema de paginação

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

Aqui está uma especificação completa para a API de repos:

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

GET /users/:username/repos

Parâmetros da string de consulta:

Os 5 primeiros estão documentados no link da API acima. Os parâmetros para pagee per_pageque estão documentados em outro lugar e são úteis em uma descrição completa.

  • type(string): Pode ser um dos all, owner, member. Padrão:owner
  • sort(string): Pode ser um dos created, updated, pushed, full_name. Padrão:full_name
  • direction(string): pode ser um ascou desc. Padrão: ascao usar full_name, caso contráriodesc
  • page (inteiro): página atual
  • per_page (inteiro): número de registros por página

Como esta é uma API HTTP GET, além de cURL, você pode experimentar isso simplesmente no navegador. Por exemplo:

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

Grokify
fonte
2

HTML

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

JavaScript

// Github repos

Se você quiser limitar a lista de repositórios, basta adicionar ?per_page=3depois username/repos.

por exemplo username/repos?per_page=3

Em vez de / username/, você pode colocar o nome de usuário de qualquer pessoa no 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();
Murtaza JAFARI
fonte
1

JSON de paginação

O código JS a seguir deve ser usado em um console.

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)
})
Mathieu CAROFF
fonte
1

A resposta é "/ users /: user / repo", mas eu tenho todo o código que faz isso em um projeto de código aberto que você pode usar para criar um aplicativo da web em um servidor.

Eu criei um projeto GitHub chamado Git-Captain que se comunica com a API GitHub que lista todos os repositórios.

É um aplicativo da web de código aberto desenvolvido com Node.js, utilizando a API GitHub para encontrar, criar e excluir um branch em vários repositórios GitHub.

Ele pode ser configurado para organizações ou um único usuário.

Também tenho um passo a passo de como configurá-lo no leia-me.

ConfusedDeer
fonte
1

Para obter o url dos 100 repositórios públicos do usuário:

$.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>

Suhailvs
fonte
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!');
    }
});
Vishal Kank
fonte
1
para obter mais detalhes, visite git docs-> developer.github.com/v3/repos
Vishal Kank
1
Bem-vindo ao SO! Por favor, verifique isso antes de postar ... Quando postar uma resposta e houver mais algumas, mostre os Prós do seu POV e, por favor, não basta postar o código, explique um pouco.
David García Bodego