629 Stimmen

Wie zählt man die Gesamtanzahl der von einem bestimmten Autor in einem Git-Repository geänderten Zeilen?

Gibt es einen Befehl, den ich aufrufen kann, um die Anzahl der Zeilen zu zählen, die von einem bestimmten Autor in einem Git-Repository geändert wurden? Ich weiß, dass es Möglichkeiten geben muss, die Anzahl der Commits zu zählen, da Github dies für ihr Impact-Diagramm macht.

2 Stimmen

Sie könnten ein bekanntes Tool in Betracht ziehen, das Statistiken für die Entwicklung des Linux-Kernels sammelt, zum Beispiel ist das Repository hier git://git.lwn.net/gitdm.git.

106voto

Jared Burrows Punkte 52572

Nachdem ich mir die Antworten von Alex und Gerty3000 angesehen habe, habe ich versucht, den Einzeiler zu verkürzen:

Im Grunde genommen wird mit git log numstat verwendet und die Anzahl der geänderten Dateien nicht verfolgt.

Git Version 2.1.0 auf 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 "hinzugefügte Zeilen: %s, entfernte Zeilen: %s, Gesamtzeilen: %s\n", add, subs, loc }' -; done

Beispiel:

Jared Burrows   hinzugefügte Zeilen: 6826, entfernte Zeilen: 2825, Gesamtzeilen: 4001

1 Stimmen

Dies war am nützlichsten für mich

104voto

Jakub Narębski Punkte 286531

Um die Anzahl der Commits eines bestimmten Autors (oder aller Autoren) auf einem bestimmten Branch zu zählen, können Sie git-shortlog verwenden; beachten Sie insbesondere die Optionen --numbered und --summary, z.B. wenn sie im Git-Repository ausgeführt wird:

$ git shortlog v1.6.4 --numbered --summary
  6904  Junio C Hamano
  1320  Shawn O. Pearce
  1065  Linus Torvalds
    692  Johannes Schindelin
    443  Eric Wong

2 Stimmen

Hinweis, dass v1.6.4 hier in diesem Beispiel vorhanden ist, um die Ausgabe deterministisch zu machen: sie wird immer gleich sein, egal wann Sie das Git-Repository geklont und/oder abgerufen haben.

0 Stimmen

Einschließlich v1.6.4 gibt mir: fatal: mehrdeutiges Argument 'v1.6.4': unbekannte Revision oder Pfad nicht im Arbeitsverzeichnis.

0 Stimmen

@Vlad: Hast du diesen Befehl im git.git Repository (das Git-Repository des Git-Quellcodes) ausgeführt? FUNKTIONIERT BEI MIR

40voto

Erik Zivkovic Punkte 3864

Die Antwort von AaronM mit dem Shell-One-Liner ist gut, aber tatsächlich gibt es noch einen weiteren Fehler, bei dem Leerzeichen die Benutzernamen beschädigen, wenn zwischen dem Benutzernamen und dem Datum unterschiedliche Mengen von Leerzeichen vorhanden sind. Die beschädigten Benutzernamen geben mehrere Zeilen für Benutzerzählungen aus, und Sie müssen sie selbst summieren.

Diese kleine Änderung hat das Problem für mich behoben:

git ls-files -z | xargs -0n1 git blame -w --show-email | perl -n -e '/^.*?\((.*?)\s+[\d]{4}/; print $1,"\n"' | sort -f | uniq -c | sort -n

Beachten Sie das + nach \s, das alle Leerzeichen vom Namen bis zum Datum verbrauchen wird.

Eigentlich füge ich diese Antwort so sehr hinzu, um mich selbst daran zu erinnern, als auch um jemand anderem zu helfen, da dies mindestens das zweite Mal ist, dass ich das Thema google :)

  • Bearbeiten 2019-01-23 Hinzugefügt --show-email zu git blame -w zum Konsolidieren nach E-Mail, da einige Personen unterschiedliche Name-Formate auf verschiedenen Computern verwenden und manchmal zwei Personen mit demselben Namen im selben Git arbeiten.

0 Stimmen

Dieses Antwort mit Perl schien etwas besser zu sein als die auf Ruby basierenden. Ruby scheiterte an Zeilen, die keinen tatsächlichen UTF-8-Text enthielten, während Perl sich nicht beschwerte. Aber hat Perl das Richtige getan? Ich weiß es nicht.

0 Stimmen

Unter Module ergeben sich nicht unterstützter Dateityp, aber ansonsten scheint es gut zu funktionieren, auch mit ihnen (sie überspringt sie).

39voto

kccqzy Punkte 1418

Hier ist ein kurzer Satz, der Statistiken für alle Autoren erstellt. Es ist viel schneller als Dans Lösung oben unter https://stackoverflow.com/a/20414465/1102119 (Meine Lösung hat eine Zeitkomplexität von O(N) anstelle von O(NM), wobei N die Anzahl der Commits und M die Anzahl der Autoren ist).

git log --no-merges --pretty=format:%an --numstat | awk '/./ && !author { author = $0; next } author { ins[author] += $1; del[author] += $2 } /^$/ { author = ""; next } END { for (a in ins) { printf "%10d %10d %10d %s\n", ins[a] - del[a], ins[a], del[a], a } }' | sort -rn

6 Stimmen

Schön aber was bedeutet die Ausgabe?

1 Stimmen

Sie sollten --no-show-signature hinzufügen, sonst werden Personen, die ihre Commits mit PGP signieren, nicht gezählt.

3 Stimmen

Ins[a] - del[a], ins[a], del[a], a , also wenn ich richtig liege Einfügungslöschung, Einfügung, Löschung, Name

31voto

@mmrobins @AaronM @ErikZ @JamesMishra haben Varianten bereitgestellt, die alle ein gemeinsames Problem haben: Sie fordern Git auf, eine Mischung von Informationen zu produzieren, die nicht für Skriptverbrauch vorgesehen sind, einschließlich Zeileninhalten aus dem Repository in der gleichen Zeile, und dann das Durcheinander mit einem regulären Ausdruck abzugleichen.

Dies ist ein Problem, wenn einige Zeilen kein gültiger UTF-8-Text sind, und auch, wenn einige Zeilen zufällig mit dem regulären Ausdruck übereinstimmen (das ist hier passiert).

Hier ist eine modifizierte Zeile, die diese Probleme nicht hat. Es fordert Git auf, die Daten sauber auf separaten Zeilen auszugeben, was es einfach macht, zuverlässig das zu filtern, was wir wollen:

git ls-files -z | xargs -0n1 git blame -w --line-porcelain | grep -a "^author " | sort -f | uniq -c | sort -n

Sie können nach anderen Zeichenketten suchen, wie author-mail, committer, usw.

Vielleicht sollten Sie zunächst export LC_ALL=C ausführen (unter der Annahme, dass bash) um die Bearbeitung auf Byteebene zu erzwingen (was auch zufällig das Filtern von UTF-8-basierten Lokalisierungen enorm beschleunigt).

0 Stimmen

Schöne Linie da, sehr cool, dass du sie leicht mischen kannst, allerdings schafft es das nicht, das zu tun, was der Original-Poster angefordert hat, eine Zählung nach Autor von git bereitzustellen. Sicher könntest du es ausführen und ein wc-l machen, usw., aber dann müsstest du es für jeden Autor im Repository wiederholen.

1 Stimmen

@AaronM Ich verstehe deine Kritik nicht. Diese Zeile gibt meines Wissens nach die gleichen Statistiken wie deine aus, nur robuster. Wenn meine Antwort also "nicht das tut, was der ursprüngliche Poster verlangt hat, nämlich eine Zählung nach Autor von Git bereitzustellen", dann tut deine das sogar noch weniger. Bitte erleuchte mich.

0 Stimmen

Entschuldigung, ich habe falsch gelesen, ich dachte, der Befehl müsste für jeden unterschiedlichen Autorennamen geändert werden. Dein Kommentar zum Grep für andere Zeichenfolgen hat mich dorthin geführt, aber es war mein Missverständnis.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X