¿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 cattodos 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 -lsi tiene archivos con espacios en el nombre.git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -ldonde la parte grep es cualquier expresión regular perl que desee!git ls-files | grep "\.java$" | xargs wc -lEsto 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 -1git 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. Utilizashla función de$()sustitución de comandos ).Salida de muestra:
Tendrás que instalar CLOC primero. Probablemente pueda instalarlo
cloccon su administrador de paquetes, por ejemplo,brew install cloccon Homebrew .cloc $(git ls-files)A menudo es una mejoracloc .. Por ejemplo, la salida de muestra anterior congit ls-filesinformes 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_modulescarpeta ignorada de Git .fuente
cloc --vcs gitestos 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 -lal tratar con grandes cantidades de archivos, donde los recuentos de líneas se dividirán en variastotallí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-eolno tiene ningún efecto cuando se usa con
--shortstat. Se cuentan las líneas en blanco.fuente
git mktree </dev/nullotrue|git mktreeogit mktree <&-o:|git mktreepara 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=gitfuente
--vcsno 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
orpatró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 -lfuente
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 -lgit 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