¿Puedes obtener el número de líneas de código de un repositorio de GitHub?

419

En un repositorio de GitHub puede ver "estadísticas de idioma", que muestra el porcentaje del proyecto que está escrito en un idioma. Sin embargo, no muestra cuántas líneas de código consta el proyecto. A menudo, quiero obtener rápidamente una impresión de la escala y la complejidad de un proyecto, y el recuento de líneas de código puede dar una buena primera impresión. 500 líneas de código implican un proyecto relativamente simple, 100,000 líneas de código implican un proyecto muy grande / complicado.

Entonces, ¿es posible obtener las líneas de código escritas en varios idiomas desde un repositorio de GitHub, preferiblemente sin clonarlo?


La pregunta " Contar el número de líneas en un repositorio de git " pregunta cómo contar las líneas de código en un repositorio de Git local, pero:

  1. Tienes que clonar el proyecto, que podría ser masivo. Clonar un proyecto como Wine, por ejemplo, lleva años.
  2. Contaría líneas en archivos que no serían necesariamente código, como los archivos i13n.
  3. Si cuenta solo (por ejemplo) archivos Ruby, podría perder una gran cantidad de código en otros idiomas, como JavaScript. Tendría que saber de antemano qué idiomas usa el proyecto. También tendría que repetir el recuento para cada idioma que usa el proyecto.

Con todo, esto es potencialmente demasiado tiempo para "comprobar rápidamente la escala de un proyecto".

Hubro
fuente
44
@ Schwern: Realmente no pensé en eso. El último commit de la rama maestra, supongo.
Hubro
8
@Abizern: ¿Es esa una razón válida para cerrar una pregunta? Estoy tratando de encontrar eso en las pautas . Mi plan era preguntar por SO primero. Si eso resultó inútil, pediría atención al cliente de Github y publicaría su información como respuesta aquí.
Hubro
77
@Abizern: Ver sobre el tema . Dice que puede hacer preguntas sobre "herramientas de software comúnmente utilizadas por los programadores".
Hubro
1
@Hubro 1 con el que he resuelto git clone --depth 1. En cuanto a 2 y 3, sospecho que existe un software que puede hacer el análisis por usted, y puede hacer muchas suposiciones basadas en extensiones de archivo, pero me está costando mucho encontrar una buena búsqueda plazo para encontrar dicho software. Quizás necesites hacer otra pregunta.
Schwern
1
Hay una herramienta en línea en codetabs.com/count-loc/count-loc-online.html , no lo he probado si es bueno.
Tgr

Respuestas:

298

Un script de shell cloc-git

Puede usar este script de shell para contar el número de líneas en un repositorio Git remoto con un comando:

#!/usr/bin/env bash
git clone --depth 1 "$1" temp-linecount-repo &&
  printf "('temp-linecount-repo' will be deleted automatically)\n\n\n" &&
  cloc temp-linecount-repo &&
  rm -rf temp-linecount-repo

Instalación

Este script requiere que se instale CLOC ("Contar líneas de código"). clocprobablemente se pueda instalar con su administrador de paquetes, por ejemplo, brew install cloccon Homebrew . También hay una imagen acoplada publicada enmribeiro/cloc .

Puede instalar el script guardando su código en un archivo cloc-git, ejecutándolo chmod +x cloc-gity luego moviendo el archivo a una carpeta en su archivo $PATHcomo /usr/local/bin.

Uso

El script toma un argumento, que es cualquier URL que git cloneacepte. Ejemplos son https://github.com/evalEmpire/perl5i.git(HTTPS) o [email protected]:evalEmpire/perl5i.git(SSH). Puede obtener esta URL desde cualquier página de proyecto de GitHub haciendo clic en "Clonar o descargar".

Salida de ejemplo:

$ cloc-git https://github.com/evalEmpire/perl5i.git
Cloning into 'temp-linecount-repo'...
remote: Counting objects: 200, done.
remote: Compressing objects: 100% (182/182), done.
remote: Total 200 (delta 13), reused 158 (delta 9), pack-reused 0
Receiving objects: 100% (200/200), 296.52 KiB | 110.00 KiB/s, done.
Resolving deltas: 100% (13/13), done.
Checking connectivity... done.
('temp-linecount-repo' will be deleted automatically)


     171 text files.
     166 unique files.                                          
      17 files ignored.

http://cloc.sourceforge.net v 1.62  T=1.13 s (134.1 files/s, 9764.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Perl                           149           2795           1425           6382
JSON                             1              0              0            270
YAML                             2              0              0            198
-------------------------------------------------------------------------------
SUM:                           152           2795           1425           6850
-------------------------------------------------------------------------------

Alternativas

Ejecute los comandos manualmente

Si no desea molestarse en guardar e instalar el script de shell, puede ejecutar los comandos manualmente. Un ejemplo:

$ git clone --depth 1 https://github.com/evalEmpire/perl5i.git
$ cloc perl5i
$ rm -rf perl5i

Lingüista

Si desea que los resultados coincidan exactamente con los porcentajes de idioma de GitHub, puede intentar instalar Linguist en lugar de CLOC . De acuerdo con su archivo README , debe gem install linguistejecutarlo y luego ejecutarlo linguist. No pude hacerlo funcionar ( número 2223 ).

Rory O'Kane
fuente
66
La pregunta original especificada sin clonar el repositorio.
linuxdan
12
@linuxdan Mi script no clona todo el repositorio; solo pasa --depth 1para descargar la confirmación más reciente. Para la mayoría de los repositorios, esto evita la preocupación de la pregunta original acerca de que la clonación demore demasiado.
Rory O'Kane
2
hombre, esto funciona asombrosamente! siempre me pregunté, cuántas líneas he codificado)
Anatoly Yakimchuk
@ RoryO'Kane podemos usar clocpara obtener las líneas de código en un repositorio de Github sin clonar el repositorio en nuestra máquina (a través de Internet). los cloc-gitprimeros clones de aslo dados anteriormente para proyectar antes de comenzar a contar el número de líneas
Kasun Siyambalapitiya
@KasunSiyambalapitiya Lo siento, no conozco ningún sitio web en línea que funcione clocpara usted. Para clocpoder contar líneas en el código, su computadora tiene que descargar ese código, aunque solo temporalmente. Tenga en cuenta que incluso los navegadores web técnicamente están descargando páginas web cuando las visita; simplemente los guardan en la memoria en lugar de en el disco.
Rory O'Kane
228

Puedes correr algo como

git ls-files | xargs wc -l

que te dará el recuento total →

líneas de código

O use esta herramienta → http://line-count.herokuapp.com/

Ahmad Awais
fuente
8
La respuesta corta a la pregunta (encontrar este número usando github) es No. Su enfoque es la segunda mejor alternativa, especialmente porque podemos filtrar cualquier archivo que necesitemos para contar.
Bernard
32
Si quieres filtro, por ejemplo, el código Python: git ls-files | grep '\.py' | xargs wc -l.
Felipe SS Schneider
3
Que estaba haciendo xargsa wc -ltodos los archivos manualmente a continuación, utilizar awkpara sumar la columna, OMG esto es mucho más fácil.
sdkks el
1
Este enfoque simple incluye comentarios en archivos. Los comentarios y las líneas en blanco no siempre se consideran "líneas de código".
Mark Stosberg
2
Bueno, la documentación es una gran parte del código. ¿Dónde dibujarías realmente la línea si eliminas los comentarios? ¿Qué pasa con los comentarios que contienen información de código como parámetros, qué pasa con los comentarios que deshabilitan ESLint para la siguiente línea? ¿Qué pasa con las líneas que son 80% comentarios después de algún código? Mira a dónde voy con esto.
Ahmad Awais
130

Hay una extensión para el navegador Google Chrome : GLOC que funciona para repositorios públicos y privados.

Cuenta el número de líneas de código de un proyecto desde:

  • página de detalles del proyecto
  • repositorios de usuarios
  • página de organización
  • página de resultados de búsqueda
  • página de tendencias
  • explorar página

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Artem Solovev
fuente
3
votó a favor aunque no parece funcionar para repositorios privados
Michail Michailidis
44
@MichailMichailidis Gracias por su sugerencia. Lo arreglaré.
Artem Solovev
44
@Taurus mi comentario no fue un CR: desde el punto de vista de la usabilidad, el gradiente hace el trabajo (por la razón que mencionaste) Quise decir que no soy un fanático de los colores elegidos, pero esa es solo mi opinión (subjetiva). Saludos :)
tech4242
2
@hellyale seguro. en unas pocas semanas
Artem Solovev
2
@hellyale También funciona para repositorios privados. Actualización de extensión. Hay más funciones nuevas para usar
Artem Solovev
70

Si va a la página de gráficos / contribuyentes, puede ver una lista de todos los contribuyentes al repositorio y cuántas líneas han agregado y eliminado.

A menos que me falte algo, restar el número agregado de líneas eliminadas del número agregado de líneas agregadas entre todos los contribuyentes debería producir el número total de líneas de código en el repositorio. (EDITAR: resulta que me faltaba algo después de todo. Echa un vistazo al comentario de orbitbot para más detalles).

ACTUALIZAR:

Estos datos también están disponibles en la API de GitHub . Entonces escribí un script rápido para obtener los datos y hacer el cálculo:

'use strict';

function countGithub(repo) {
fetch('https://api.github.com/repos/'+repo+'/stats/contributors')
    .then(response => response.json())
    .then(contributors => contributors
        .map(contributor => contributor.weeks
            .reduce((lineCount, week) => lineCount + week.a - week.d, 0)))
    .then(lineCounts => lineCounts.reduce((lineTotal, lineCount) => lineTotal + lineCount))
    .then(lines => window.alert(lines));
}

countGithub('jquery/jquery'); // or count anything you like

Simplemente péguelo en un fragmento de Chrome DevTools, cambie el repositorio y haga clic en Ejecutar.

Descargo de responsabilidad (gracias a lovasoa ):

Tome los resultados de este método con un grano de sal, porque para algunos repositorios (sorich87 / bootstrap-tour) da como resultado valores negativos, lo que podría indicar que hay algo mal con los datos devueltos por la API de GitHub.

ACTUALIZAR:

Parece que este método para calcular el número total de líneas no es del todo confiable. Echa un vistazo al comentario de orbitbot para más detalles.

Luis
fuente
Derecha. Pero en algunos casos donde el proyecto es un gran proyecto comunitario de código abierto, este tipo de conteo no es factible.
franklin
@franklin Definitivamente. Sin embargo, estos datos también están disponibles en la API de GitHub , por lo que puede escribir un script para calcular el número total de líneas con bastante facilidad. Actualicé mi respuesta con un script rápido que acabo de escribir.
Lewis
Sería más simple usar la API code_frequecy. Dando: fetch("https://api.github.com/repos/jquery/jquery/stats/code_frequency").then(x=>x.json()).then(x=>alert(x.reduce((total,changes)=>total+changes[1]+changes[2],0)))
lovasoa
Hmmm ... Interesante: prueba tu código en sorich87 / bootstrap-tour. El resultado es negativo.
lovasoa
3
@Lewis Creo que no tiene en cuenta que las líneas agregadas / eliminadas en una confirmación pueden ser lo mismo que otras confirmaciones, por ejemplo, al fusionar ramas, etc., que aún cuentan para el mismo total. Además, las estadísticas de contribuciones de Github para los perfiles de usuario solo se cuentan desde la rama predeterminada o las páginas gh, por lo que podría haber algo similar para las estadísticas de compromiso / línea: help.github.com/articles/… . También tenga en cuenta que las estadísticas del perfil de usuario solo cuentan el año anterior, pero creo que las estadísticas de confirmación en la página del gráfico son permanentes.
orbitbot
38

Puede clonar solo el último commit usando git clone --depth 1 <url>y luego realizar su propio análisis usando Linguist , el mismo software que usa Github. Esa es la única forma en que sé que vas a obtener líneas de código.

Otra opción es usar la API para enumerar los idiomas que usa el proyecto . No los da en líneas sino en bytes. Por ejemplo...

$ curl https://api.github.com/repos/evalEmpire/perl5i/languages
{
  "Perl": 274835
}

Aunque tome eso con un grano de sal, ese proyecto incluye YAML y JSON que el sitio web reconoce pero la API no.

Finalmente, puede usar la búsqueda de código para preguntar qué archivos coinciden con un idioma determinado. Este ejemplo pregunta qué archivos en perl5i son Perl. https://api.github.com/search/code?q=language:perl+repo:evalEmpire/perl5i. No le dará líneas, y debe solicitar el tamaño del archivo por separado utilizando el devuelto urlpara cada archivo.

Schwern
fuente
Genial, no sabía sobre eso. ¿Puede confirmar que no se puede hacer en el sitio web de Github?
Hubro
No puedo confirmarlo, pero no veo nada en la API o en el sitio web de Github que le brinde líneas. Es todo bytes o porcentajes. ¿Cuál es su razón para hacerlo a través de la API en lugar de la clonación?
Schwern
Ok, gracias por la información sin embargo. Le pediré ayuda a Github.
Hubro
Linguist se ve genial, pero ¿cómo logras que te muestre líneas de código? Parece que muestra bytes por defecto, al igual que la API.
Hubro
@Hubro Dunno, es posible que tengas que parcharlo.
Schwern
33

Actualmente no es posible en Github.com o sus API-s

He hablado con el servicio de atención al cliente y confirmó que esto no se puede hacer en github.com. Sin embargo, han pasado la sugerencia al equipo de Github, así que espero que sea posible en el futuro. Si es así, me aseguraré de editar esta respuesta.

Mientras tanto, la respuesta de Rory O'Kane es una alternativa brillante basada en clocun clon de reposo superficial.

Hubro
fuente
2
No directamente, pero su API de estadísticas tiene todos los datos que necesita para calcularlo usted mismo. Vea mi respuesta a continuación para obtener un script rápido que hace esto.
Lewis
12

Puede usar la API de GitHub para obtener el sloc como la siguiente función

function getSloc(repo, tries) {

    //repo is the repo's path
    if (!repo) {
        return Promise.reject(new Error("No repo provided"));
    }

    //GitHub's API may return an empty object the first time it is accessed
    //We can try several times then stop
    if (tries === 0) {
        return Promise.reject(new Error("Too many tries"));
    }

    let url = "https://api.github.com/repos" + repo + "/stats/code_frequency";

    return fetch(url)
        .then(x => x.json())
        .then(x => x.reduce((total, changes) => total + changes[1] + changes[2], 0))
        .catch(err => getSloc(repo, tries - 1));
}

Personalmente, hice una extensión de Chrome que muestra el número de SLOC tanto en la lista de proyectos de github como en la página de detalles del proyecto. También puede configurar su token de acceso personal para acceder a repositorios privados y omitir el límite de la tasa de API.

Puede descargar desde aquí https://chrome.google.com/webstore/detail/github-sloc/fkjjjamhihnjmihibcmdnianbcbccpnn

El código fuente está disponible aquí https://github.com/martianyi/github-sloc

Yi Kai
fuente
Para la extensión de cromo, ¿cómo se determina el SLOC? Todos los tipos de archivos? ¿Excluir directorios específicos?
Brett Reinhard el
@BrettReinhard Se basa en la cantidad de adiciones y eliminaciones por semana , creo que incluye todos los archivos.
Yi Kai
¿No solo eso devuelve el número de cambios en la última semana?
Johannes 'fish' Ziemke
@ Johannes'fish'Ziemke No, regresa todas las semanas
Yi Kai
11

Complemento de Firefox Github SLOC

Escribí un pequeño complemento de Firefox que imprime el número de líneas de código en las páginas del proyecto github: Github SLOC

lovasoa
fuente
Gran complemento, muy útil! ¿Sabes si es posible hacerlo funcionar con repositorios privados? Parece que solo muestra LOC en repositorios públicos.
rococó
El enlace está inactivo y, después de buscarlo manualmente, parece que lamentablemente este complemento ya no existe.
dCSeven
También hay una solicitud para que GLOC esté disponible para Firefox, y el desarrollador parece abierto a la idea: github.com/artem-solovev/gloc/issues/23
miyalys
1
@miyalys Ya está hecho: addons.mozilla.org/en-US/firefox/addon/gloc
Shachaf Zohar
7

Si la pregunta es "¿puede obtener rápidamente NÚMERO DE LÍNEAS de un repositorio de github", la respuesta es no como se indica en las otras respuestas.

Sin embargo, si la pregunta es "¿puede verificar rápidamente la ESCALA de un proyecto", generalmente calculo un proyecto mirando su tamaño. Por supuesto, el tamaño incluirá deltas de todas las confirmaciones activas, pero es una buena métrica ya que el orden de magnitud es bastante cercano.

P.ej

¿Qué tan grande es el proyecto "docker"?

En su navegador, ingrese api.github.com/repos/ORG_NAME/PROJECT_NAME, es decir, api.github.com/repos/docker/docker

En el hash de respuesta, puede encontrar el atributo de tamaño:

{
    ...
    size: 161432,
    ...
}

Esto debería darle una idea de la escala relativa del proyecto. El número parece estar en KB, pero cuando lo revisé en mi computadora es en realidad más pequeño, a pesar de que el orden de magnitud es consistente. (161432KB = 161MB, du -s -h docker = 65MB)

Jimmy Da
fuente
1
npm install sloc -g
git clone --depth 1 https://github.com/vuejs/vue/
sloc ".\vue\src" --format cli-table
rm -rf ".\vue\"

Instrucciones y explicación

  1. Instale sloc desde npm , una herramienta de línea de comando ( Node.js necesita estar instalado).
npm install sloc -g
  1. Repositorio poco profundo de clonación (descarga más rápida que la clonación completa).
git clone --depth 1 https://github.com/facebook/react/
  1. Ejecute sloc y especifique la ruta que debe analizarse.
sloc ".\react\src" --format cli-table

sloc admite formatear la salida como a cli-table, como jsono csv. Las expresiones regulares se pueden usar para excluir archivos y carpetas ( Más información sobre npm ).

  1. Eliminar la carpeta del repositorio (opcional)

Powershell: rm -r -force ".\react\"o en Mac / Unix:rm -rf ".\react\"

Capturas de pantalla de los pasos ejecutados (cli-table):

salida de sloc como acli-table

salida sloc (sin argumentos):

salida de sloc sin argumentos

Tobi Obeck
fuente
Esto no parece funcionar para archivos R como .R o .Rmd
jzadra
1

Canalice la salida del número de líneas en cada archivo sortpara organizar los archivos por recuento de líneas. git ls-files | xargs wc -l |sort -n

KhmerCoder
fuente
0

Abra la terminal y ejecute lo siguiente:

curl https://api.codetabs.com/v1/loc?github=username/reponame
ishandutta2007
fuente