¿Cómo recuperar la lista de todos los repositorios de GitHub de una persona?


90

Estamos trabajando en un proyecto en el que necesitamos mostrar todos los proyectos de una persona en su repositorio en la cuenta de GitHub.

¿Alguien puede sugerir cómo puedo mostrar los nombres de todos los repositorios de git de una persona en particular usando su nombre de usuario de git?

Respuestas:


63

Puedes usar la api de github para esto. Al presionar, https://api.github.com/users/USERNAME/reposse listarán los repositorios públicos para el usuario NOMBRE DE USUARIO .


6
también puede elegir la cantidad de repositorios que obtiene con ?per_page= developer.github.com/v3/#pagination
OzzyCzech

1
api.github.com/users/USERNAME/repos?page=1 da la primera página de resultados. (cambie de 1 a 2 y así sucesivamente, el valor predeterminado es 30 resultados por página)
stevec

39

Utilice la API de Github :

/users/:user/repos

Esto le dará todos los repositorios públicos del usuario. Si necesita encontrar repositorios privados, deberá autenticarse como el usuario en particular. Luego puede usar la llamada REST:

/user/repos

para encontrar todos los repositorios del usuario.

Para hacer esto en Python, haga 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

Donde la URL pasada a la función es la URL REST como en los ejemplos anteriores. Si no necesita autenticarse, simplemente modifique el método para eliminar la adición del encabezado de autorización. A continuación, puede obtener cualquier URL de API pública mediante una simple solicitud GET.


27
Esto solo dará la primera "página" del conjunto de resultados, que se establece en 30 elementos de forma predeterminada. Puede usar ?per_page=100para obtener la cantidad máxima, pero si un usuario tiene más de cien repositorios, deberá seguir varias nextURL en el Linkenvío del encabezado HTTP con la respuesta.
Potherca

2
Gracias @Potherca, ¡justo lo que estaba buscando!
aknuds1

33

Pruebe el siguiente curlcomando para enumerar los repositorios:

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

Para enumerar las URL clonadas, ejecute:

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

Si es privado, debe agregar su clave API ( access_token=GITHUB_API_TOKEN), por ejemplo:

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

Si el usuario es una organización, utilice /orgs/:username/reposen su lugar para devolver todos los repositorios.

Para clonarlos, consulte: ¿Cómo clonar todos los repositorios a la vez desde GitHub?

Ver también: Cómo descargar GitHub Release desde un repositorio privado usando la línea de comandos


9
Esto muestra solo los primeros 100 repositorios, independientemente de la extensión per_page=1000.
jm666

2
Agregue la -sopción a su curlcomando para deshacerse de esas barras de progreso antiestéticas, como encurl -s ...
xmnboy

5
Como dice @ jm666, el tamaño máximo de página es 100. Para ver la segunda página, haga: curl " api.github.com/users/$USER/repos?per_page=100 \ & page = 2"
rscohn2

2
El ejemplo privado no funcionará con el ejemplo, / users / "en plural" solo devuelve repositorios públicos. Debe ir con api.github.com/user/repos y agregar el token en la solicitud para obtener los privados.
LeandroCR

2
@kenorb misterio resuelto, el usuario es una organización, así que /orgs/:username/reposdevuelva todos los repositorios, /users/...devuelva parte de ellos, esto es realmente extraño. el nombre de usuario puede tratarse tanto como un usuario como como una organización.
ios learner

11

Si tiene jq instalado, puede usar el siguiente comando para listar todos los repositorios públicos de un usuario

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

6

Probablemente necesite una solución jsonp:

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

Si 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>


3

Los repositorios del módulo NPM capturan el JSON para todos los repositorios públicos de algún usuario o grupo. Puede ejecutar esto directamente desde npxpara que no necesite instalar nada, simplemente elija una organización o usuario ("W3C" aquí):

$ npx repos W3C W3Crepos.json

Esto creará un archivo llamado W3Crepos.json. Grep es lo suficientemente bueno como para, por ejemplo, obtener la lista de repositorios:

$ grep full_name W3Crepos.json

pros:

  • Funciona con más de 100 repositorios (muchas respuestas a esta pregunta no lo hacen).
  • No hay mucho que escribir.

contras:

  • Requiere npx(o npmsi desea instalarlo de verdad).

3

Recupere la lista de todos los repositorios públicos de un usuario de GitHub que usa 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")

Referencia


1
esto no funciona (tal vez sea para la versión api anterior)
OzzyCzech

2
sí, hay un pequeño cambio. He editado mi respuesta y ahora funciona bien.
darshanc99

3

Ahora hay una opción para usar el asombroso GraphQL API Explorer .

Quería una lista de todos los repositorios activos de mi organización con sus respectivos idiomas. Esta consulta hace precisamente eso:

{
  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

Si busca repositorios de una organización-

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

Ejemplo:

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

También puede agregar el parámetro per_page para obtener todos los nombres en caso de que haya un problema de paginación.

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

3

Aquí hay una especificación completa para la API de repositorios:

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

GET /users/:username/repos

Parámetros de cadena de consulta:

Los primeros 5 están documentados en el enlace API anterior. Los parámetros para pagey per_pageque están documentados en otra parte y son útiles en una descripción completa.

  • type(cadena): Puede ser uno de all, owner, member. Defecto:owner
  • sort(cadena): Puede ser uno de created, updated, pushed, full_name. Defecto:full_name
  • direction(cadena): puede ser uno de asco desc. Predeterminado: asccuando se usa full_name, de lo contrariodesc
  • page (entero): página actual
  • per_page (entero): número de registros por página

Dado que se trata de una API HTTP GET, además de cURL, puede probar esto simplemente en el navegador. Por ejemplo:

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


2

HTML

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

JavaScript

// Repositorios de Github

Si desea limitar la lista de repositorios, puede agregar ?per_page=3después username/repos.

p.ej username/repos?per_page=3

En lugar de / username/, puede poner el nombre de usuario de cualquier persona en 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

Paging JSON

El código JS a continuación está diseñado para usarse en una consola.

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

La respuesta es "/ users /: user / repo", pero tengo todo el código que hace esto en un proyecto de código abierto que puede usar para instalar una aplicación web en un servidor.

Presenté un proyecto de GitHub llamado Git-Captain que se comunica con la API de GitHub que enumera todos los repositorios.

Es una aplicación web de código abierto creada con Node.js que utiliza la API de GitHub para buscar, crear y eliminar una rama en numerosos repositorios de GitHub.

Se puede configurar para organizaciones o un solo usuario.

También tengo un paso a paso sobre cómo configurarlo en el archivo read-me.


1

Para obtener la URL de los 100 repositorios públicos del usuario:

$.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
para obtener más detalles, visite git docs-> developer.github.com/v3/repos
Vishal Kank

1
¡Bienvenido a SO! Por favor, compruebe esto antes de publicar ... Cuando publique una respuesta y haya algunas más, muestre las ventajas de su punto de vista y, por favor, no se limite a publicar el código, explíquelo un poco.
David García Bodego
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.