Actualizar
git ls-tree -r -z --name-only HEAD -- */*.c | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
He actualizado algunas cosas en el camino.
Por conveniencia, también puede poner esto en su propio comando:
#!/bin/bash
# save as i.e.: git-authors and set the executable flag
git ls-tree -r -z --name-only HEAD -- $1 | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
almacena esto en algún lugar de tu camino o modifica tu camino y úsalo como
git authors '*/*.c' # look for all files recursively ending in .c
git authors '*/*.[ch]' # look for all files recursively ending in .c or .h
git authors 'Makefile' # just count lines of authors in the Makefile
Respuesta original
Si bien la respuesta aceptada hace el trabajo, es muy lenta.
$ git ls-tree --name-only -z -r HEAD|egrep -z -Z -E '\.(cc|h|cpp|hpp|c|txt)$' \
|xargs -0 -n1 git blame --line-porcelain|grep "^author "|sort|uniq -c|sort -nr
Es casi instantáneo.
Para obtener una lista de los archivos actualmente rastreados, puede usar
git ls-tree --name-only -r HEAD
Esta solución evita llamar file
para determinar el tipo de archivo y utiliza grep para que coincida con la extensión deseada por razones de rendimiento. Si se deben incluir todos los archivos, simplemente elimine esto de la línea.
grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files
grep -E '\.py$' # for Python files
si los archivos pueden contener espacios, que son malos para los shells, puede usar:
git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'
Dé una lista de archivos (a través de una tubería), uno puede usar xargs para llamar a un comando y distribuir los argumentos. Los comandos que permiten que se procesen varios archivos, obmiten el -n1
. En este caso llamamos git blame --line-porcelain
y para cada llamada usamos exactamente 1 argumento.
xargs -n1 git blame --line-porcelain
Luego filtramos la salida para las ocurrencias de "autor", ordenamos la lista y contamos las líneas duplicadas por:
grep "^author "|sort|uniq -c|sort -nr
Nota
Otras respuestas en realidad filtran líneas que contienen solo espacios en blanco.
grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "
El comando anterior imprimirá autores de líneas que contengan al menos un carácter que no sea un espacio en blanco. También puede usar la coincidencia, \w*[^\w#]
que también excluirá líneas donde el primer carácter que no sea un espacio en blanco no es un #
(comentario en muchos lenguajes de secuencias de comandos).