Aktualisieren
git ls-tree -r -z --name-only HEAD -- */*.c | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
Ich habe unterwegs einige Dinge aktualisiert.
Der Einfachheit halber können Sie dies auch in einen eigenen Befehl einfügen:
#!/bin/bash
# save as i.e.: git-authors and set the executable flag
git ls-tree -r -z --name-only HEAD -- $1 | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep "^author "|sort|uniq -c|sort -nr
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.
$ git ls-tree --name-only -z -r HEAD|egrep -z -Z -E '\.(cc|h|cpp|hpp|c|txt)$' \
|xargs -0 -n1 git blame --line-porcelain|grep "^author "|sort|uniq -c|sort -nr
ist fast augenblicklich.
Um eine Liste der aktuell verfolgten Dateien zu erhalten, können Sie verwenden
git ls-tree --name-only -r HEAD
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.
grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files
grep -E '\.py$' # for Python files
Wenn die Dateien Leerzeichen enthalten können, die für Shells schlecht sind, können Sie Folgendes verwenden:
git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'
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 auf git blame --line-porcelain
und verwenden für jeden Aufruf genau 1 Argument.
xargs -n1 git blame --line-porcelain
Wir filtern dann die Ausgabe nach Vorkommen von "Autor", sortieren die Liste und zählen doppelte Zeilen nach:
grep "^author "|sort|uniq -c|sort -nr
Hinweis
Andere Antworten filtern tatsächlich Zeilen heraus, die nur Leerzeichen enthalten.
grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "
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).