remota - ¿Puede obtener el número de líneas de código de un repositorio de GitHub?
git push example (9)
En un repositorio de GitHub puede ver "estadísticas del idioma", que muestra el porcentaje del proyecto que está escrito en un idioma. Sin embargo, no muestra en 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 " Número de líneas de conteo en un repositorio de git " pregunta cómo contar las líneas de código en un repositorio de Git local, pero:
- Tienes que clonar el proyecto, que podría ser masivo. La clonación de un proyecto como Wine, por ejemplo, lleva siglos.
- Contaría líneas en archivos que no necesariamente serían código, como los archivos i13n.
- Si cuenta solo (por ejemplo) los archivos de Ruby, podría perder una gran cantidad de código en otros idiomas, como JavaScript. Tendrías que saber de antemano qué idiomas usa el proyecto. También tendría que repetir el recuento para cada idioma que utilice el proyecto.
Con todo, esto es potencialmente demasiado tiempo para "verificar rápidamente la escala de un proyecto".
Simplemente puede ejecutar algo como
git ls-files | xargs wc -l
lo que le dará la cuenta total →
O use esta herramienta → http://line-count.herokuapp.com/
Complemento para Firefox Github SLOC
Escribí un pequeño complemento para Firefox que imprime el número de líneas de código en las páginas del proyecto github: Github SLOC
Un script de shell, cloc-git
Puede usar este script de shell para contar el número de líneas en un repositorio de 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
Esta secuencia de comandos requiere que CLOC ("Count Lines of Code") esté instalado. cloc
probablemente se puede instalar con su administrador de paquetes, por ejemplo, brew install cloc
con Homebrew .
Puede instalar el script guardando su código en un archivo cloc-git
, ejecutando chmod +x cloc-git
, y luego moviendo el archivo a una carpeta en su $PATH
como /usr/local/bin
.
Uso
El script toma un argumento, que es cualquier URL que git clone
aceptará. Algunos ejemplos son https://github.com/evalEmpire/perl5i.git
(HTTPS) o [email protected]:evalEmpire/perl5i.git
(SSH). Puede obtener esta URL desde cualquier página del proyecto de GitHub haciendo clic en "Clonar o descargar".
Ejemplo de salida:
$ 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
Ejecutar 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 lugar de CLOC . De acuerdo con su README , necesitas gem install linguist
y luego ejecutar el linguist
. No pude hacerlo funcionar ( problema # 2223 ).
Actualmente no es posible en Github.com o sus API-s
He hablado con el servicio de atención al cliente y he confirmado 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 brillante alternativa basada en cloc
y un clon de repo superficial.
Puede clonar solo la última confirmación usando git clone --depth 1 <url>
y luego realizar su propio análisis utilizando Linguist , el mismo software que usa Github. Esa es la única manera 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 se les 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 poco 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ódigos 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 la url
devuelta para cada archivo.
Puedes 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 en la lista de proyectos de github y en la página de detalles del proyecto. También puede configurar su token de acceso personal para acceder a los repositorios privados y omitir el límite de velocidad 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
Si la pregunta es "¿puedes obtener rápidamente el NÚMERO DE LÍNEAS de un repositorio de github?", La respuesta es no como lo indican las otras respuestas.
Sin embargo, si la pregunta es "¿puedes verificar rápidamente la ESCALA de un proyecto?", Generalmente evalúo un proyecto observando 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 en realidad es más pequeño, aunque el orden de magnitud sea consistente. (161432KB = 161MB, du -s -h docker = 65MB)
Si va a la página de gráficos / colaboradores, puede ver una lista de todos los colaboradores del repositorio y cuántas líneas han agregado y eliminado.
A menos que me falte algo, restar la cantidad agregada de líneas eliminadas de la cantidad agregada de líneas sumadas entre todos los contribuyentes debería producir la cantidad total de líneas de código en el repositorio. (EDIT: 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. Así que escribí un script rápido para obtener los datos y hacer el cálculo:
''use strict'';
//replace jquery/jquery with the repo you''re interested in
fetch(''https://api.github.com/repos/jquery/jquery/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));
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 repos (sorich87 / bootstrap-tour) se obtienen valores negativos, lo que podría indicar que hay algo incorrecto 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 a los comentarios de orbitbot para más detalles.