Respuestas:
xargs
hará lo que quieras:
git ls-files | xargs cat | wc -l
Pero con más información y probablemente mejor, puede hacer:
git ls-files | xargs wc -l
grep cpp |
ahí antes xargs
, 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
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904
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:
git diff --shortstat `git hash-object -t tree /dev/null`
Te dará una cadena como 1770 files changed, 166776 insertions(+)
.
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.
cloc $(git ls-files)
(Esta línea es equivalente a git ls-files | xargs cloc
. Utiliza sh
la función de $()
sustitución de comandos ).
Salida de muestra:
20 text files.
20 unique files.
6 files ignored.
http://cloc.sourceforge.net v 1.62 T=0.22 s (62.5 files/s, 2771.2 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Javascript 2 13 111 309
JSON 3 0 0 58
HTML 2 7 12 50
Handlebars 2 0 0 37
CoffeeScript 4 1 4 12
SASS 1 1 1 5
-------------------------------------------------------------------------------
SUM: 14 22 128 471
-------------------------------------------------------------------------------
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 mejora cloc .
. Por ejemplo, la salida de muestra anterior con git 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 la node_modules
carpeta ignorada de Git .
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 varias total
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')
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 de COMMAND
.
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).
git diff --shortstat `git hash-object -t tree /dev/null`
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
git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904
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.
git mktree </dev/null
o true|git mktree
o git 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
--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 ella
Entonces esto es lo que uso ahora:
git ls-files | grep "\(.html\|.css\|.js\|.java\)$" | xargs wc -l
Yo uso lo siguiente:
git grep ^ | wc -l
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.
Hice esto:
git ls-files | xargs file | grep "ASCII" | cut -d : -f 1 | xargs wc -l
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.
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:
: | git mktree | git diff --shortstat --stdin
O:
git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin
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
"xargs -P 4" significa que puede leer los archivos usando cuatro procesos paralelos. Esto puede ser realmente útil si está escaneando repositorios muy grandes. Dependiendo de la capacidad de la máquina, puede aumentar el número de procesos.
-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)