Mostrar el número de líneas cambiadas por autor en git

Quiero ver el número de líneas eliminadas / agregadas, agrupadas por autor para una twig determinada en el historial de git. hay git shortlog -s que me muestra el número de confirmaciones por autor. ¿hay algo similar para get un diffstat general?

Es una publicación antigua, pero si alguien todavía la está buscando:

instalar git extras

 brew install git-extras 

entonces

 git summary --line 

https://github.com/tj/git-extras

Desde la pregunta SO "¿Cómo contar las líneas totales modificadas por un autor específico en un repository de Git?" no es completamente satisfactorio, commandlinefu tiene alternativas (aunque no por twig):

 git ls-files | while read i; do git blame $i | sed -e 's/^[^(]*(//' -e 's/^\([^[:digit:]]*\)[[:space:]]\+[[:digit:]].*/\1/'; done | sort | uniq -ic | sort -nr 

Incluye files binarys, lo cual no es bueno, por lo que podría (para eliminar files binarys realmente aleatorios):

 git ls-files | grep -v "\.\(pdf\|psd\|tif\)$" 

(Nota: como comentó trcarden , una opción -x o --exclude no funcionaría.
Desde la página de git ls-files , git ls-files -x "*pdf" ... solo excluiría el contenido sin seguimiento , si --others o --ignonetworking se agregaron al git ls-files .)

O:

 git ls-files "*.py" "*.html" "*.css" 

para include solo types de files específicos.


Aún así, una solución basada en " git log " debería ser mejor, como:

 git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}' 

pero nuevamente, esto es para una ruta (aquí 2 confirmaciones), no para todas las twigs por twigs.

Este script aquí lo hará. Póngalo en authorship.sh, chmod + x it, y ya está todo listo.

 #!/bin/sh declare -A map while read line; do if grep "^[a-zA-Z]" <<< "$line" > /dev/null; then current="$line" if [ -z "${map[$current]}" ]; then map[$current]=0 fi elif grep "^[0-9]" <<<"$line" >/dev/null; then for i in $(cut -f 1,2 <<< "$line"); do map[$current]=$((map[$current] + $i)) done fi done <<< "$(git log --numstat --pretty="%aN")" for i in "${!map[@]}"; do echo -e "$i:${map[$i]}" done | sort -nr -t ":" -k 2 | column -t -s ":" 

¿Cómo contar las líneas totales modificadas por un autor específico en un repository de Git?

El resultado del siguiente command debe ser razonablemente fácil de enviar al script para sumr los totales:

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

Esto proporciona statistics para todos los commits en el HEAD actual. Si desea agregar statistics en otras twigs, deberá proporcionarlas como arguments para git log.

En mis reposs obtuve una gran cantidad de basura de las frases sueltas, así que aquí está una secuencia de commands de Python para hacerlo bien:

 import subprocess import collections import sys def get_lines_from_call(command): return subprocess.check_output(command).splitlines() def get_files(paths=()): command = ['git', 'ls-files'] command.extend(paths) return get_lines_from_call(command) def get_blame(path): return get_lines_from_call(['git', 'blame', path]) def extract_name(line): """ Extract the author from a line of a standard git blame """ return line.split('(', 1)[1].split(')', 1)[0].rsplit(None, 4)[0] def get_file_authors(path): return [extract_name(line) for line in get_blame(path)] def blame_stats(paths=()): counter = collections.Counter() for filename in get_files(paths): counter.update(get_file_authors(filename)) return counter def main(): counter = blame_stats(sys.argv[1:]) max_width = len(str(counter.most_common(1)[0][1])) for name, count in reversed(counter.most_common()): print('%s %s' % (str(count).rjust(max_width), name)) if __name__ == '__main__': main() 

Tenga en count que los arguments del script se pasarán a git ls-files , por lo que si solo desea mostrar files de Python: blame_stats.py '**/*.py'

Si solo desea mostrar files en un subdirectory: blame_stats.py some_dir

Y así.