¿Cómo contar el total de líneas modificadas por un autor específico en un repositorio Git?
¿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.
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 Awk
en 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-lines
alias de git:
Simplemente cree count-lines
un 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 reemplaceawk
parte congawk
.
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-stats
a 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
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, --numstat
es 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
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).
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
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