¿Cómo contaría el número total de líneas presentes en todos los archivos en un repositorio git?
git ls-files
me da una lista de archivos rastreados por git.
Estoy buscando un comando para cat
todos esos archivos. Algo como
git ls-files | [cat all these files] | wc -l
bash
git
shell
line-count
Dogbert
fuente
fuente
grep cpp |
ahí antesxargs
, entonces.git ls-files -z | xargs -0 wc -l
si tiene archivos con espacios en el nombre.git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -l
donde la parte grep es cualquier expresión regular perl que desee!git ls-files | grep "\.java$" | xargs wc -l
Esto muestra las diferencias del árbol vacío a su árbol de trabajo actual. Lo que sucede para contar todas las líneas en su árbol de trabajo actual.
Para obtener los números en su árbol de trabajo actual, haga esto:
Te dará una cadena como
1770 files changed, 166776 insertions(+)
.fuente
git hash-object -t tree /dev/null
.git diff --stat `git hash-object -t tree /dev/null`
git diff --stat `git hash-object -t tree /dev/null` | tail -1
git diff --shortstat `git hash-object -t tree /dev/null`
para obtener la última línea, la cola no es necesaria.Si desea este recuento porque quiere tener una idea del alcance del proyecto, puede preferir la salida de CLOC ("Contar líneas de código"), que le ofrece un desglose de líneas de código significativas e insignificantes por idioma.
(Esta línea es equivalente a
git ls-files | xargs cloc
. Utilizash
la función de$()
sustitución de comandos ).Salida de muestra:
Tendrás que instalar CLOC primero. Probablemente pueda instalarlo
cloc
con su administrador de paquetes, por ejemplo,brew install cloc
con Homebrew .cloc $(git ls-files)
A menudo es una mejoracloc .
. Por ejemplo, la salida de muestra anterior congit ls-files
informes 471 líneas de código. Para el mismo proyecto,cloc .
reporta la friolera de 456,279 líneas (y tarda seis minutos en ejecutarse), porque busca las dependencias en lanode_modules
carpeta ignorada de Git .fuente
cloc --vcs git
estos días, lo que evita algunos casos extremos con archivos mal nombrados (o demasiados).Me he encontrado con problemas de procesamiento por lotes
git ls-files | xargs wc -l
al tratar con grandes cantidades de archivos, donde los recuentos de líneas se dividirán en variastotal
líneas.Tomando un consejo de la pregunta ¿Por qué la utilidad wc genera múltiples líneas con "total"? , Encontré el siguiente comando para evitar el problema:
wc -l $(git ls-files)
O si solo desea examinar algunos archivos, por ejemplo, el código:
wc -l $(git ls-files | grep '.*\.cs')
fuente
wc -l $(git ls-files | find *.m *.h)
wc -l --files0-from=<(git ls-files -z)
. La<(COMMAND)
sintaxis devuelve el nombre de un archivo cuyo contenido es el resultado deCOMMAND
.La mejor solución, para mí de todos modos, está enterrada en los comentarios de la respuesta de @ ephemient. Solo lo estoy jalando aquí para que no pase desapercibido. El crédito para esto debe ir a @FRoZeN (y @ephemient).
devuelve el total de archivos y líneas en el directorio de trabajo de un repositorio, sin ningún ruido adicional. Como beneficio adicional, solo se cuenta el código fuente: los archivos binarios se excluyen de la cuenta.
El comando anterior funciona en Linux y OS X. La versión multiplataforma es
Eso también funciona en Windows.
Para el registro, las opciones para excluir líneas en blanco,
-w
/--ignore-all-space
,-b
/--ignore-space-change
,--ignore-blank-lines
,--ignore-space-at-eol
no tiene ningún efecto cuando se usa con
--shortstat
. Se cuentan las líneas en blanco.fuente
git mktree </dev/null
otrue|git mktree
ogit mktree <&-
o:|git mktree
para los contadores de pulsaciones de teclas entre nosotros :-) - un árbol vacío de repuesto flotando alrededor del repositorio no va a doler nada.Esto funciona a partir del cloc 1.68:
cloc --vcs=git
fuente
--vcs
no funcionó para mí, tal vez fue eliminado.cloc .
mientras que en el repositorio de git funcionó, OTOH.Estaba jugando con cmder ( http://gooseberrycreative.com/cmder/ ) y quería contar las líneas de html, css, java y javascript. Si bien algunas de las respuestas anteriores funcionaron, el
or
patrón en grep no funcionó: encontré aquí ( /unix/37313/how-do-i-grep-for-multiple-patterns ) que tenía para escapar de ellaEntonces esto es lo que uso ahora:
git ls-files | grep "\(.html\|.css\|.js\|.java\)$" | xargs wc -l
fuente
Yo uso lo siguiente:
Esto busca en todos los archivos versionados por git para la expresión regular
^
, que representa el comienzo de una línea, por lo que este comando da el número total de líneas.fuente
Hice esto:
esto funciona si cuenta todos los archivos de texto en el repositorio como los archivos de interés. Si algunos se consideran documentación, etc., se puede agregar un filtro de exclusión.
fuente
Esta herramienta en github https://github.com/flosse/sloc puede proporcionar la salida de manera más descriptiva. Creará estadísticas de su código fuente:
fuente
Tratar:
en el directorio / directorios en cuestión
fuente
O:
fuente
Dependiendo de si desea o no incluir archivos binarios, hay dos soluciones.
git grep --cached -al '' | xargs -P 4 cat | wc -l
git grep --cached -Il '' | xargs -P 4 cat | wc -l
-a, procesar archivos binarios como texto (Incluir binario)
-l '', mostrar solo nombres de archivo en lugar de líneas coincidentes (Escanear solo archivos no vacíos)
-I, no hacer coincidir patrones en archivos binarios (Excluir binario) - en
caché, buscar en el índice en lugar de en el árbol de trabajo (Incluir archivos no confirmados)
fuente