2010-05-07 22 views
24

Ich möchte die Anzahl der entfernten/addierten Zeile, nach Autor für eine bestimmte Branche in git Geschichte gruppiert sehen. gibt es git shortlog -s, die mir die Anzahl der Commits pro Autor zeigt. Gibt es etwas Ähnliches, um einen allgemeinen diffstat zu bekommen?Zeige Anzahl der geänderten Zeilen pro Autor in Git

+1

Würde http://stackoverflow.com/questions/1265040/how-to-count-total-lines-changed-by-a-spezifische-author-in-a-git-repository Hilfe? Wie in 'git shortlog abranch --numbered --summary' – VonC

+1

@VonC, ich' git shortlog --numbered --summary' ist das gleiche wie 'git shortlog -s -n', es wird nur die Anzahl der Commits angezeigt, Nicht die geänderten Zeilen – knittl

Antwort

18

Da the SO question "How to count total lines changed by a specific author in a Git repository?" ist nicht völlig zufriedenstellend, commandlinefu hat Alternativen (wenn auch nicht pro Zweig):

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 

Es enthält binäre Dateien, die nicht gut ist, so könnte man (entfernen wirklich zufällige binäre Dateien):

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

(Anmerkung:. als commented von trcarden, eine -x oder --exclude Option würde nicht funktionieren
Von git ls-files man page würde git ls-files -x "*pdf" ... nur untracked Inhalte ausgeschlossen, wenn --others oder --ignored zum git ls-files Befehl hinzugefügt wurden)

. Oder:

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

nur bestimmte Dateitypen umfassen.


Dennoch soll ein "git log"-based solution besser sein, wie:

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

aber wieder, das für einen Weg (hier 2 Commits), nicht für alle Verzweigungen pro Zweig.

+1

Git Log ist das einzige, was mich nicht barf, nette Anregung! – jjxtra

+0

Sie können Binärdateien nicht über die angegebene Methode ignorieren. Der Befehl -x für ls-Dateien ist nur für "nicht verfolgte Dateien" verfügbar. Häufiger Fehler. – trcarden

+0

@trcarden Sehr guter Punkt. Ich habe die Antwort bearbeitet und einen alternativen Weg vorgeschlagen, um Binärdateien auszuschließen. – VonC

2

Dieses Skript hier wird es tun. Setzen Sie es in authorship.sh, chmod + x, und Sie sind fertig.

#!/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 ":" 
+3

Erhalte dies sowohl unter Mac OS X 10.6.8 als auch unter Debian Linux 5.0.8: '/ Benutzer/slippyd/Desktop/git-authorship: Zeile 3: deklariere: -A: ungültige Option deklariere: usage: declare [-afFirtx] [-p] [Name [= Wert] ...] ' –

+0

Dieses Skript hat wunderbar funktioniert. Vielen Dank! – ColinM

+0

bekomme den gleichen Fehler wie slipp auf einem Mac, ich änderte die -A zu -a (wie in der Fehlermeldung angegeben), aber das Skript scheitert trotzdem, anscheinend behandelt es nicht Leerzeichen in Namen (wie der Abstand zwischen dem ersten und Nachname), immer noch auf der Suche nach einer Lösung, die funktioniert, könnten Sie denken, dass dies etwas ist, was viele Leute brauchen, um Werbung zu bekommen :), anscheinend nicht. Nun, ich werde nur 90% Boss sagen! –

1

Von How to count total lines changed by a specific author in a Git repository?

Der Ausgang des folgenden Befehls sollte relativ einfach sein Skript zu senden und die Summen zu addieren:

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

Dies gibt Statistiken für alle Commits auf dem aktuellen HEAD . Wenn Sie Statistiken in anderen Zweigen hinzufügen möchten, müssen Sie sie als Argumente für git log angeben.

31

Es ist eine alte Post, aber wenn jemand noch es zu suchen ist:

git Extras

brew install git-extras 

dann

git summary --line 

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

+2

'apt-get install git-extras' für Linux-Benutzer – alex

+1

' fatal: unerkanntes Argument: --line' Ich denke, sie haben die Option in der neuesten Version – M2X

+0

@ M2X entfernt, es sieht so aus 'git line-summary' funktioniert, obwohl es in den Dokumenten gesagt wird, dass es für '--line' veraltet ist https://github.com/tj/git-extras/blob/master/Commands.md#git-line-summary – dav

1

Auf meinem repos installieren Ich habe viel Trash von den One-Linern, die herumfliegen, also hier wollen blame_stats.py '**/*.py'

Wenn Sie nur zu: ist ein Python-Skript, um es richtig zu machen:

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() 

Beachten Sie, dass die Argumente für das Skript zu git ls-files weitergegeben werden, so dass, wenn Sie nur Python-Dateien anzeigen möchten Zeige Dateien in einem Unterverzeichnis: blame_stats.py some_dir

Und so weiter.

Verwandte Themen