Gibt es einen Befehl, den ich aufrufen kann, der die von einem bestimmten Autor in einem Git-Repository geänderten Zeilen zählt? Ich weiß, dass es Möglichkeiten geben muss, die Anzahl der Commits zu zählen, da Github dies für das Impact-Diagramm tut.
458
git://git.lwn.net/gitdm.git
.Antworten:
Die Ausgabe des folgenden Befehls sollte relativ einfach an das Skript zu senden sein, um die Summen zu addieren:
Dies gibt Statistiken für alle Commits auf dem aktuellen HEAD. Wenn Sie Statistiken in anderen Zweigen addieren möchten, müssen Sie diese als Argumente angeben
git log
.Für die Übergabe an ein Skript kann sogar das "Online" -Format mit einem leeren Protokollformat entfernt werden. Wie von Jakub Narębski kommentiert,
--numstat
ist dies eine weitere Alternative. Es generiert Statistiken pro Datei und nicht pro Zeile, ist jedoch noch einfacher zu analysieren.quelle
--numstat
stattdessen verwenden,--shortstat
wenn Sie Statistiken etwas einfacher addieren möchten.git help log
sagt mir, dass die ersten Zeilen hinzugefügt, die zweiten Zeilen gelöscht werden.Dies gibt einige Statistiken über den Autor, ändern Sie nach Bedarf.
Verwenden von Gawk:
Verwenden von Awk unter Mac OS X:
EDIT (2017)
Es gibt ein neues Paket auf Github, das schick aussieht und Bash als Abhängigkeiten verwendet (unter Linux getestet). Es ist eher für den direkten Gebrauch als für Skripte geeignet.
Es ist Git-Quick-Statistik (Github-Link) .
In
git-quick-stats
einen Ordner kopieren und den Ordner zum Pfad hinzufügen.Verwendungszweck:
quelle
gawk
,awk
damit es im OSX-Terminalgit clone https://github.com/arzzen/git-quick-stats.git
Für den Fall, dass jemand die Statistiken für jeden Benutzer in seiner Codebasis sehen möchte, haben sich kürzlich einige meiner Mitarbeiter diesen schrecklichen Einzeiler ausgedacht:
(Es dauert ein paar Minuten, bis wir unser Repo mit ca. 10-15.000 Commits durchgearbeitet haben.)
quelle
michael,: 6057 files changed, 854902 insertions(+), 26973 deletions(-), 827929 net
Git Ruhm https://github.com/oleander/git-fame-rb
ist ein nützliches Tool, um die Anzahl aller Autoren gleichzeitig zu ermitteln, einschließlich der Anzahl der festgeschriebenen und geänderten Dateien:
Es gibt auch eine Python-Version unter https://github.com/casperdcl/git-fame (erwähnt von @fracz):
Beispielausgabe:
Aber seien Sie gewarnt: Wie von Jared im Kommentar erwähnt, dauert es Stunden, dies in einem sehr großen Repository zu tun. Ich bin mir nicht sicher, ob das verbessert werden könnte, wenn man bedenkt, dass so viele Git-Daten verarbeitet werden müssen.
quelle
git fame --branch=dev --timeout=-1 --exclude=Pods/*
Ich fand Folgendes nützlich, um zu sehen, wer die meisten Zeilen in der Codebasis hatte:
Die anderen Antworten haben sich hauptsächlich auf Zeilen konzentriert, die in Commits geändert wurden. Wenn Commits jedoch nicht überleben und überschrieben werden, wurden sie möglicherweise nur abgewickelt. Mit der obigen Beschwörung erhalten Sie auch alle Committer nach Zeilen sortiert und nicht nur nacheinander. Sie können git tad (-C -M) einige Optionen hinzufügen, um bessere Zahlen zu erhalten, die die Dateibewegung und die Zeilenverschiebung zwischen Dateien berücksichtigen. In diesem Fall wird der Befehl jedoch möglicherweise viel länger ausgeführt.
Wenn Sie nach Zeilen suchen, die in allen Commits für alle Committer geändert wurden, ist das folgende kleine Skript hilfreich:
http://git-wt-commit.rubyforge.org/#git-rank-contributors
quelle
/^.*\((.*?)\s[\d]{4}/
sollte sein/^.*?\((.*?)\s[\d]{4}/
, um zu verhindern, dass Klammern in der Quelle als Autor übereinstimmen.Um die Anzahl der Commits eines bestimmten Autors (oder aller Autoren) in einem bestimmten Zweig zu zählen, können Sie git-shortlog verwenden . Siehe insbesondere seine
--numbered
und--summary
Optionen, z. B. wenn sie im Git-Repository ausgeführt werden:quelle
v1.6.4
hier in diesem Beispiel der Fall ist, um die Ausgabe deterministisch zu gestalten: Es ist unabhängig davon, wann Sie das Git-Repository geklont und / oder abgerufen haben, dasselbe.v1.6.4
gibt mir:fatal: ambiguous argument 'v1.6.4': unknown revision or path not in the working tree.
git shortlog -sne
oder, wenn Sie lieber keine Zusammenschlüsse einschließengit shortlog -sne --no-merges
-s
is--summary
,-n
is--numbered
und [new]-e
soll--email
E-Mails von Autoren anzeigen (und denselben Autor mit unterschiedlicher E-Mail-Adresse unter Berücksichtigung von.mailmap
Korrekturen separat zählen ). Guter Anruf über--no-merges
.Nachdem ich mir die Antwort von Alex und Gerty3000 angesehen habe , habe ich versucht, den Einzeiler zu verkürzen:
Grundsätzlich verwenden Sie git log numstat und verfolgen nicht die Anzahl der geänderten Dateien .
Git Version 2.1.0 unter Mac OSX:
Beispiel:
quelle
Die Antwort von AaronM mit dem Shell- Einzeiler 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 Leerzeichen vorhanden sind. Die beschädigten Benutzernamen geben mehrere Zeilen für die Anzahl der Benutzer an, und Sie müssen sie selbst zusammenfassen.
Diese kleine Änderung hat das Problem für mich behoben:
Beachten Sie das + nach \ s, das alle Leerzeichen vom Namen bis zum Datum belegt.
Eigentlich füge ich diese Antwort sowohl für meine eigene Erinnerung als auch für die Hilfe für andere hinzu, da dies mindestens das zweite Mal ist, dass ich das Thema google :)
--show-email
,git blame -w
um stattdessen E-Mails zu aggregieren, da einige Benutzer unterschiedlicheName
Formate auf unterschiedlichen Computern verwenden und manchmal zwei Personen mit demselben Namen im selben Git arbeiten.quelle
unsupported file type
aber ansonsten scheint es auch mit ihnen in Ordnung zu funktionieren (es überspringt sie).Hier ist ein kurzer Einzeiler, der Statistiken für alle Autoren erstellt. Es ist viel schneller als die oben beschriebene Lösung von Dan unter https://stackoverflow.com/a/20414465/1102119 (meine hat die Zeitkomplexität O (N) anstelle von O (NM), wobei N die Anzahl der Commits und M die Anzahl der Autoren ist ).
quelle
--no-show-signature
, sonst werden Personen, die ihre Commits pgp-signieren, nicht gezählt.count-lines = "!f() { 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; }; f"
. (Beachten Sie, dass ich unter Windows bin; möglicherweise müssen Sie verschiedene Arten von Anführungszeichen verwenden)@mmrobins @AaronM @ErikZ @JamesMishra lieferte Varianten, die alle ein gemeinsames Problem haben: Sie fordern git auf, eine Mischung von Informationen zu erstellen, die nicht für den Skriptverbrauch bestimmt sind, einschließlich des Zeileninhalts aus dem Repository in derselben Zeile, und ordnen das Durcheinander dann einem regulären Ausdruck zu .
Dies ist ein Problem, wenn einige Zeilen keinen gültigen UTF-8-Text enthalten und wenn einige Zeilen mit dem regulären Ausdruck übereinstimmen (dies ist hier geschehen).
Hier ist eine modifizierte Zeile, die diese Probleme nicht hat. Es fordert git auf, Daten sauber in separaten Zeilen auszugeben, was es einfach macht, das, was wir wollen, robust zu filtern:
Sie können nach anderen Zeichenfolgen wie Author-Mail, Committer usw. suchen.
Vielleicht zuerst
export LC_ALL=C
(vorausgesetztbash
), um die Verarbeitung auf Byte-Ebene zu erzwingen (dies beschleunigt auch grep von den UTF-8-basierten Gebietsschemas enorm).quelle
Es wurde eine Lösung mit Ruby in der Mitte angegeben, wobei Perl standardmäßig etwas verfügbarer ist. Hier ist eine Alternative, bei der Perl für aktuelle Zeilen nach Autor verwendet wird.
quelle
Zusätzlich zu Charles Baileys Antwort möchten Sie möglicherweise den
-C
Parameter zu den Befehlen hinzufügen . Andernfalls zählen Umbenennungen von Dateien als viele Hinzufügungen und Entfernungen (so viele wie die Datei Zeilen enthält), selbst wenn der Dateiinhalt nicht geändert wurde.Zur Veranschaulichung hier ein Commit mit vielen Dateien, die mit dem folgenden
git log --oneline --shortstat
Befehl aus einem meiner Projekte verschoben werden :Und hier das gleiche Commit mit dem
git log --oneline --shortstat -C
Befehl, der Dateikopien erkennt und umbenennt:Meiner Meinung nach gibt letzteres einen realistischeren Überblick darüber, wie viel Einfluss eine Person auf das Projekt hatte, da das Umbenennen einer Datei viel kleiner ist als das Schreiben der Datei von Grund auf.
quelle
Sie können whodid verwenden ( https://www.npmjs.com/package/whodid )
und
oder einfach tippen
dann können Sie das Ergebnis so sehen
quelle
-g
musste vor dem Paketnamen kommen, aufmacOS
. Einfach versuchen zu helfen.Hier ist ein kurzes Ruby-Skript, das die Auswirkungen pro Benutzer auf eine bestimmte Protokollabfrage vergleicht.
Zum Beispiel für Rubinius :
das Skript:
quelle
Dies ist der beste Weg und gibt Ihnen auch ein klares Bild der Gesamtzahl der Commits aller Benutzer
quelle
Ich habe oben eine Modifikation einer kurzen Antwort angegeben, die jedoch für meine Bedürfnisse nicht ausreichte. Ich musste in der Lage sein, sowohl festgeschriebene Zeilen als auch Zeilen im endgültigen Code zu kategorisieren. Ich wollte auch eine Aufschlüsselung nach Dateien. Dieser Code wird nicht wiederholt, sondern gibt nur die Ergebnisse für ein einzelnes Verzeichnis zurück. Es ist jedoch ein guter Anfang, wenn jemand weiter gehen möchte. Kopieren Sie eine Datei, fügen Sie sie in eine Datei ein und machen Sie sie ausführbar oder führen Sie sie mit Perl aus.
quelle
Für Windows-Benutzer können Sie das folgende Batch-Skript verwenden, das die hinzugefügten / entfernten Zeilen für den angegebenen Autor zählt
https://gist.github.com/zVolodymyr/62e78a744d99d414d56646a5e8a1ff4f
quelle
Hier ist ein großartiges Repo, das dir das Leben leichter macht
git-quick-stats
Auf einem Mac mit installiertem Gebräu
brew install git-quick-stats
Lauf
git-quick-stats
Wählen Sie einfach die gewünschte Option aus dieser Liste aus, indem Sie die angegebene Nummer eingeben und die Eingabetaste drücken.
quelle
Dieses Skript hier wird es tun. Setzen Sie es in autorship.sh, chmod + x it ein und Sie sind fertig.
quelle
Speichern Sie Ihre Protokolle in einer Datei mit:
Für Python-Liebhaber:
Ihre Ausgaben wären wie folgt:
quelle
Du willst Git die Schuld geben .
Es gibt eine --show-stats-Option, um einige Statistiken zu drucken.
quelle
blame
, aber es gab nicht wirklich die Statistiken, von denen ich dachte, dass das OP sie brauchen würde?Die Frage fragte nach Informationen zu einem bestimmten Autor, aber viele der Antworten waren Lösungen, die Ranglisten von Autoren basierend auf ihren geänderten Codezeilen zurückgaben.
Das war es, wonach ich gesucht habe, aber die vorhandenen Lösungen waren nicht ganz perfekt. Im Interesse von Personen, die diese Frage möglicherweise über Google finden, habe ich einige Verbesserungen vorgenommen und sie in ein Shell-Skript umgewandelt, das ich unten anzeige. Eine kommentierte (die ich weiterhin pflegen werde) befindet sich auf meinem Github .
Es gibt keine Abhängigkeiten von Perl oder Ruby. Darüber hinaus werden Leerzeichen, Umbenennungen und Zeilenbewegungen bei der Anzahl der Zeilenänderungen berücksichtigt. Fügen Sie dies einfach in eine Datei ein und übergeben Sie Ihr Git-Repository als ersten Parameter.
quelle
Das beste Tool, das ich bisher identifiziert habe, ist gitinspector. Es gibt den festgelegten Bericht pro Benutzer, pro Woche usw. Sie können wie unten mit npm installieren
npm install -g gitinspector
Die Links, um mehr Details zu erhalten
https://www.npmjs.com/package/gitinspector
https://github.com/ejwa/gitinspector/wiki/Documentation
https://github.com/ejwa/gitinspector
Beispielbefehle sind
quelle
Ich habe dieses Perl-Skript geschrieben, um diese Aufgabe zu erfüllen.
Ich habe es benannt
git-line-changes-by-author
und hineingesteckt/usr/local/bin
. Da es in meinem Pfad gespeichert ist, kann ich den Befehl ausgebengit line-changes-by-author --before 2018-12-31 --after 2020-01-01
zum Abrufen des Berichts für das Jahr 2019 . Als Beispiel. Und wenn ich falsch schreiben würde, würde der Name git die richtige Schreibweise vorschlagen.Möglicherweise möchten Sie das
_get_repo_slug
Sub so anpassen , dass es nur den letzten Teil derremote.origin.url
Repos enthält, unter denen meine Repos gespeichert sind,project/repo
und Ihre möglicherweise nicht.quelle