¿Cómo contar el total de líneas modificadas por un autor específico en un repositorio Git?

Resuelto Gav asked hace 15 años • 24 respuestas

¿Existe algún comando que pueda invocar y que cuente las líneas modificadas por un autor específico en un repositorio de Git? Sé que debe haber formas de contar la cantidad de confirmaciones, ya que Github hace esto para su gráfico de Impacto.

Gav avatar Aug 12 '09 15:08 Gav
Aceptado

Esto proporciona algunas estadísticas sobre el autor, modifíquelas según sea necesario.

Usando Gawk:

git log --author="_Your_Name_Here_" --pretty=tformat: --numstat \
| gawk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s removed lines: %s total lines: %s\n", add, subs, loc }' -

Usando Awken Mac OSX:

git log --author="_Your_Name_Here_" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -

Usando count-linesalias de git:

Simplemente cree count-linesun alias (una vez por sistema), como:

git config --global alias.count-lines "! git log --author=\"\$1\" --pretty=tformat: --numstat | awk '{ add += \$1; subs += \$2; loc += \$1 - \$2 } END { printf \"added lines: %s, removed lines: %s, total lines: %s\n\", add, subs, loc }' #"

Y úselo cada vez más tarde, como:

git count-lines [email protected]

Para Windows , funciona después de agregar Git-Bash a PATH(variable de entorno).
Para Linux , tal vez reemplace awkparte con gawk.
Para MacOS , funciona sin ningún cambio.

Usando script existente (Actualización 2017)

Hay un nuevo paquete en github que parece elegante y usa bash como dependencias (probado en Linux). Es más adecuado para uso directo que para scripts.

Es git-quick-stats (enlace de github) .

Copie git-quick-statsa una carpeta y agregue la carpeta a la ruta.

mkdir ~/source
cd ~/source
git clone [email protected]:arzzen/git-quick-stats.git
mkdir ~/bin
ln -s ~/source/git-quick-stats/git-quick-stats ~/bin/git-quick-stats
chmod +x ~/bin/git-quick-stats
export PATH=${PATH}:~/bin

Uso:

git-quick-stats

ingrese la descripción de la imagen aquí

Alexander Oh avatar Aug 10 '2011 12:08 Alexander Oh

La salida del siguiente comando debería ser razonablemente fácil de enviar al script para sumar los totales:

git log --author="<authorname>" --oneline --shortstat

Esto proporciona estadísticas para todas las confirmaciones en el HEAD actual. Si desea sumar estadísticas en otras ramas, deberá proporcionarlas como argumentos git log.

Para pasar a un script, se puede eliminar incluso el formato "oneline" con un formato de registro vacío y, como comentó Jakub Narębski, --numstates otra alternativa. Genera estadísticas por archivo en lugar de por línea, pero es aún más fácil de analizar.

git log --author="<authorname>" --pretty=tformat: --numstat
CB Bailey avatar Aug 12 '2009 09:08 CB Bailey

En caso de que alguien quiera ver las estadísticas de cada usuario en su código base, recientemente a un par de mis compañeros de trabajo se les ocurrió esta horrible frase:

git log --shortstat --pretty="%cE" | sed 's/\(.*\)@.*/\1/' | grep -v "^$" | awk 'BEGIN { line=""; } !/^ / { if (line=="" || !match(line, $0)) {line = $0 "," line }} /^ / { print line " # " $0; line=""}' | sort | sed -E 's/# //;s/ files? changed,//;s/([0-9]+) ([0-9]+ deletion)/\1 0 insertions\(+\), \2/;s/\(\+\)$/\(\+\), 0 deletions\(-\)/;s/insertions?\(\+\), //;s/ deletions?\(-\)//' | awk 'BEGIN {name=""; files=0; insertions=0; deletions=0;} {if ($1 != name && name != "") { print name ": " files " files changed, " insertions " insertions(+), " deletions " deletions(-), " insertions-deletions " net"; files=0; insertions=0; deletions=0; name=$1; } name=$1; files+=$2; insertions+=$3; deletions+=$4} END {print name ": " files " files changed, " insertions " insertions(+), " deletions " deletions(-), " insertions-deletions " net";}'

(Se necesitan unos minutos para analizar nuestro repositorio, que tiene entre 10 y 15 000 confirmaciones).

Dan avatar Dec 06 '2013 01:12 Dan

git-fama

https://github.com/oleander/git-fame-rb

Esta es una buena herramienta para obtener el recuento de todos los autores a la vez, incluido el recuento de archivos confirmados y modificados:

sudo apt-get install ruby-dev
sudo gem install git_fame
cd /path/to/gitdir && git fame

También hay una versión de Python en https://github.com/casperdcl/git-fame (mencionada por @fracz):

sudo apt-get install python-pip python-dev build-essential 
pip install --user git-fame
cd /path/to/gitdir && git fame

Salida de muestra:

Total number of files: 2,053
Total number of lines: 63,132
Total number of commits: 4,330

+------------------------+--------+---------+-------+--------------------+
| name                   | loc    | commits | files | percent            |
+------------------------+--------+---------+-------+--------------------+
| Johan Sørensen         | 22,272 | 1,814   | 414   | 35.3 / 41.9 / 20.2 |
| Marius Mathiesen       | 10,387 | 502     | 229   | 16.5 / 11.6 / 11.2 |
| Jesper Josefsson       | 9,689  | 519     | 191   | 15.3 / 12.0 / 9.3  |
| Ole Martin Kristiansen | 6,632  | 24      | 60    | 10.5 / 0.6 / 2.9   |
| Linus Oleander         | 5,769  | 705     | 277   | 9.1 / 16.3 / 13.5  |
| Fabio Akita            | 2,122  | 24      | 60    | 3.4 / 0.6 / 2.9    |
| August Lilleaas        | 1,572  | 123     | 63    | 2.5 / 2.8 / 3.1    |
| David A. Cuadrado      | 731    | 111     | 35    | 1.2 / 2.6 / 1.7    |
| Jonas Ängeslevä        | 705    | 148     | 51    | 1.1 / 3.4 / 2.5    |
| Diego Algorta          | 650    | 6       | 5     | 1.0 / 0.1 / 0.2    |
| Arash Rouhani          | 629    | 95      | 31    | 1.0 / 2.2 / 1.5    |
| Sofia Larsson          | 595    | 70      | 77    | 0.9 / 1.6 / 3.8    |
| Tor Arne Vestbø        | 527    | 51      | 97    | 0.8 / 1.2 / 4.7    |
| spontus                | 339    | 18      | 42    | 0.5 / 0.4 / 2.0    |
| Pontus                 | 225    | 49      | 34    | 0.4 / 1.1 / 1.7    |
+------------------------+--------+---------+-------+--------------------+

Pero tenga cuidado: como menciona Jared en el comentario, hacerlo en un repositorio muy grande llevará horas. Sin embargo, no estoy seguro de si eso podría mejorarse, considerando que debe procesar muchos datos de Git.

Lo siguiente me resultó útil para ver quién tenía más líneas actualmente en el código base:

git ls-files -z | xargs -0n1 git blame -w | ruby -n -e '$_ =~ /^.*\((.*?)\s[\d]{4}/; puts $1.strip' | sort -f | uniq -c | sort -n

Las otras respuestas se han centrado principalmente en líneas cambiadas en las confirmaciones, pero si las confirmaciones no sobreviven y se sobrescriben, es posible que simplemente se hayan cancelado. El encantamiento anterior también ordena a todos los confirmadores por líneas en lugar de solo uno a la vez. Puede agregar algunas opciones para culpar a git (-C -M) para obtener mejores números que tengan en cuenta el movimiento de archivos y el movimiento de líneas entre archivos, pero el comando podría ejecutarse por mucho más tiempo si lo hace.

Además, si busca líneas modificadas en todas las confirmaciones para todos los confirmadores, el siguiente pequeño script es útil:

http://git-wt-commit.rubyforge.org/#git-rank-contributors

mmrobins avatar Mar 19 '2011 05:03 mmrobins

Después de mirar la respuesta de Alex y Gerty3000 , intenté acortar la frase:

Básicamente, usar git log numstat y no realizar un seguimiento de la cantidad de archivos modificados.

Git versión 2.1.0 en Mac OSX:

git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done

Ejemplo:

Jared Burrows   added lines: 6826, removed lines: 2825, total lines: 4001
Jared Burrows avatar Sep 16 '2014 18:09 Jared Burrows