Wie kann ich Schuld (oder eine besser geeignete Funktion und / oder in Verbindung mit Shell-Befehlen) "missbrauchen", um eine Statistik darüber zu erhalten, wie viele Zeilen (Code) sich derzeit im Repository befinden, die von jedem Committer stammen?
Beispielausgabe:
Committer 1: 8046 Lines
Committer 2: 4378 Lines
Antworten:
Aktualisieren
Ich habe unterwegs einige Dinge aktualisiert.
Der Einfachheit halber können Sie dies auch in einen eigenen Befehl einfügen:
Speichern Sie dies irgendwo in Ihrem Pfad oder ändern Sie Ihren Pfad und verwenden Sie ihn wie folgt
git authors '*/*.c' # look for all files recursively ending in .c
git authors '*/*.[ch]' # look for all files recursively ending in .c or .h
git authors 'Makefile' # just count lines of authors in the Makefile
Ursprüngliche Antwort
Während die akzeptierte Antwort die Arbeit erledigt, ist sie sehr langsam.
ist fast augenblicklich.
Um eine Liste der aktuell verfolgten Dateien zu erhalten, können Sie verwenden
Diese Lösung vermeidet das Aufrufen
file
zur Ermittlung des Dateityps und verwendet aus Leistungsgründen grep, um die gewünschte Erweiterung zu finden. Wenn alle Dateien enthalten sein sollen, entfernen Sie diese einfach aus der Zeile.Wenn die Dateien Leerzeichen enthalten können, die für Shells schlecht sind, können Sie Folgendes verwenden:
Geben Sie eine Liste von Dateien (über eine Pipe) an. Mit xargs können Sie einen Befehl aufrufen und die Argumente verteilen. Befehle, mit denen mehrere Dateien verarbeitet werden können, lassen die
-n1
. In diesem Fall rufen wir aufgit blame --line-porcelain
und verwenden für jeden Aufruf genau 1 Argument.Wir filtern dann die Ausgabe nach Vorkommen von "Autor", sortieren die Liste und zählen doppelte Zeilen nach:
Hinweis
Andere Antworten filtern tatsächlich Zeilen heraus, die nur Leerzeichen enthalten.
Mit dem obigen Befehl werden Autoren von Zeilen gedruckt, die mindestens ein Nicht-Leerzeichen enthalten. Sie können auch eine Übereinstimmung verwenden,
\w*[^\w#]
die auch Zeilen ausschließt, in denen das erste Nicht-Leerzeichen kein Zeichen ist#
(Kommentar in vielen Skriptsprachen).quelle
echo "a\nb\nc"|xargs -n1 cmd
wird erweitert aufcmd a; cmd b; cmd d
git ls-tree --name-only -r HEAD | grep -E '\.(cc|h|m|hpp|c)$' | xargs -n1 git blame --line-porcelain | grep "^author "|sort|uniq -c|sort -nr
Ich habe ein Juwel namens Git-Fame geschrieben , das nützlich sein könnte.
Installation und Verwendung:
$ gem install git_fame
$ cd /path/to/gitdir
$ git fame
Ausgabe:
quelle
Schritt für Schritt Erklärung:
Listen Sie alle Dateien unter Versionskontrolle auf
Beschneiden Sie die Liste nur auf Textdateien
Git beschuldigt alle Textdateien und ignoriert Änderungen an Leerzeichen
Ziehen Sie die Autorennamen heraus
Sortieren Sie die Liste der Autoren und lassen Sie die Anzahl der sich nacheinander wiederholenden Zeilen uniq zählen
Beispielausgabe:
quelle
sed
Version habe, meine versteht die-r
Flagge nicht und hat Probleme mit der Regex (beschwert sich über unausgeglichene Parens, selbst wenn ich den Überschuss entferne(
).sudo brew install gnu-sed
löste es. Klappt wunderbar!port install gsed
für MacPorts-Benutzer.sudo brew install gnu-sed
(was funktioniert hat) gemacht, aber ich bekomme immer noch Fehler, die sed nicht erkennt -r. :(git ls-tree -r HEAD|gsed -re 's/^.{53}//'|while read filename; do file "$filename"; done|grep -E ': .*text'|gsed -r -e 's/: .*//'|while read filename; do git blame -w "$filename"; done|gsed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//'|sort|uniq -c
git summary
Das Git-Extras- Paket bietet genau das, was Sie brauchen. Überprüfen Sie die Dokumentation unter git-extras - git-summary :Gibt eine Ausgabe aus, die folgendermaßen aussieht:
quelle
Eriks Lösung war fantastisch, aber ich hatte einige Probleme mit Diakritika (obwohl meine
LC_*
Umgebungsvariablen scheinbar richtig eingestellt waren) und Rauschen, das in Codezeilen mit Datumsangaben durchgesickert ist. Mein Sed-Fu ist schlecht, also habe ich dieses Frankenstein-Snippet mit Rubin erhalten, aber es funktioniert für mich auf über 200.000 LOC einwandfrei und sortiert die Ergebnisse:Beachten Sie auch ,
gsed
statt ,sed
denn das ist die binäre Homebrew installiert, so dass das System sed intakt.quelle
git shortlog -sn
Dies zeigt eine Liste der Commits pro Autor.
quelle
Hier ist der primäre Ausschnitt aus der Antwort von @Alex, der tatsächlich die Aggregation der Schuldlinien ausführt. Ich habe es gekürzt, um mit einer einzelnen Datei anstatt mit einer Reihe von Dateien zu arbeiten.
Ich poste dies hier, weil ich oft auf diese Antwort zurückkomme und den Beitrag erneut lese und die Beispiele neu verdaue, um den Teil zu extrahieren, den ich für anstrengend halte. Es ist auch nicht generisch genug für meinen Anwendungsfall. Der Geltungsbereich gilt für ein ganzes C-Projekt.
Ich mag es, Statistiken pro Datei aufzulisten, die mit einem Bash-
for
Iterator erreicht wurden, anstatt Xargsxargs
weniger lesbar und schwer zu verwenden / auswendig zu lernen. Die Vor- und Nachteile von Xargs gegenüber for sollten an anderer Stelle besprochen werden.Hier ist ein praktischer Ausschnitt, der die Ergebnisse für jede Datei einzeln anzeigt:
Und ich habe getestet, dass das Ausführen dieses Strights in einer Bash-Shell Strg + C-sicher ist. Wenn Sie dies in ein Bash-Skript einfügen müssen, müssen Sie möglicherweise SIGINT und SIGTERM einfangen, wenn der Benutzer Ihre for-Schleife unterbrechen soll.
quelle
git blame -w -M -C -C --line-porcelain path/to/file.txt | grep -I '^author ' | sort | uniq -ic | sort -nr
Ich habegit blame
hier eine leichte Änderung gefunden, die die gesuchten Statistiken genauer wiedergibt. Insbesondere die Optionen -M und -C-C (dies sind absichtlich zwei Cs). -M erkennt Verschiebungen innerhalb einer Datei und -C -C erkennt kopierte Zeilen aus anderen Dateien. Siehe Dokument hier . Der Vollständigkeit halber ignoriert -w Leerzeichen.Schauen Sie sich die gitstats von verfügbaren Befehls http://gitstats.sourceforge.net/
quelle
Ich habe diese Lösung, die die beschuldigten Zeilen in allen Textdateien zählt (mit Ausnahme der Binärdateien, auch der versionierten):
quelle
Dies funktioniert in jedem Verzeichnis der Quellstruktur des Repos, falls Sie ein bestimmtes Quellmodul überprüfen möchten.
quelle
Ich habe die Top-Antwort auf Powershell übernommen:
Es ist optional, ob Sie
git blame
mit dem-w
Switch arbeiten. Ich habe ihn hinzugefügt, da er Leerzeichenänderungen ignoriert.Die Leistung auf meinem Computer war zugunsten von Powershell (~ 50s gegenüber ~ 65s für dasselbe Repo), obwohl die Bash-Lösung unter WSL2 lief
quelle
Ich habe mein eigenes Skript erstellt, das eine Kombination aus @nilbus und @Alex ist
quelle
enter code here
Probleme verursacht ... funktioniert das richtig?Bash-Funktion, die auf eine einzelne Quelldatei abzielt, die unter MacOS ausgeführt wird.
quelle