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.

805voto

Alexander Oh Punkte 22027

Dies gibt einige Statistiken über den Autor, ändern Sie bei Bedarf.

Verwenden von Gawk:

git log --author="_Ihr_Name_Hier_" --pretty=tformat: --numstat \
| gawk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "hinzugefügte Zeilen: %s entfernte Zeilen: %s Gesamtzeilen: %s\n", add, subs, loc }' -

Verwenden von Awk auf Mac OSX:

git log --author="_Ihr_Name_Hier_" --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 }' -

Verwenden von Gib-Zeilen-zählen git-Alias:

Erstellen Sie einfach einen count-lines Alias (einmal pro System), wie:

git config --global alias.count-lines "! git log --author=\"\$1\" --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 }' #"

Und verwenden Sie es später jedes Mal, wie:

git count-lines email@example.com

Für Windows, funktioniert, nachdem Git-Bash zu PATH hinzugefügt wurde (Umgebungsvariable).
Für Linux, möglicherweise ersetzen Sie den awk Teil durch gawk.
Für MacOS, funktioniert ohne jegliche Änderung.

Verwenden des vorhandenen Skripts (Update 2017)

Es gibt ein neues Paket auf github, das schick aussieht und bash als Abhängigkeiten verwendet (getestet unter Linux). Es ist eher für die direkte Verwendung geeignet als für Skripte.

Es ist git-quick-stats (Github-Link).

Kopiere git-quick-stats in einen Ordner und füge den Ordner zum Pfad hinzu.

mkdir ~/Quelle
cd ~/Quelle
git clone git@github.com:arzzen/git-quick-stats.git
mkdir ~/bin
ln -s ~/Quelle/git-quick-stats/git-quick-stats ~/bin/git-quick-stats
chmod +x ~/bin/git-quick-stats
export PATH=${PATH}:~/bin

Verwendung:

git-quick-stats

Bildbeschreibung hier eingeben

0 Stimmen

Auch wie dieses zeigt, um genaue Zahlen für einen bestimmten Autor zu erhalten, müssen möglicherweise einige Dateien ausgeschlossen werden (wie Bibliotheken usw.), die von ihnen committet wurden, aber nicht wirklich von ihnen verfasst wurden.

0 Stimmen

Das ist falsch. Du musst -M -C an die Befehlszeile liefern.

0 Stimmen

@AndyShevchenko Bitte könnten Sie näher erläutern, warum dies falsch ist und was M und C tun?

379voto

CB Bailey Punkte 693084

Die Ausgabe des folgenden Befehls sollte relativ einfach an ein Skript gesendet werden, um die Summen hinzuzufügen:

git log --author="" --oneline --shortstat

Dies gibt Statistiken für alle Commits im aktuellen HEAD. Wenn Sie Statistiken in anderen Branches hinzufügen möchten, müssen Sie sie als Argumente an git log übergeben.

Zum Übergeben an ein Skript kann das Entfernen des "oneline"-Formats sogar mit einem leeren Log-Format erfolgen, und wie von Jakub Narebski kommentiert, ist --numstat eine weitere Alternative. Es erstellt pro Datei, anstatt pro Zeile, Statistiken, ist aber noch einfacher zu analysieren.

git log --author="" --pretty=tformat: --numstat

10 Stimmen

Möglicherweise möchten Sie auch "--no-merges" hinzufügen.

13 Stimmen

Es tut mir leid für diese Fragen, aber was sagen mir die Zahlen? Es gibt zwei Zeilen und ich habe keine Ahnung, was sie mir sagen. Linien geändert und hinzugefügt?

0 Stimmen

-M -C fehlen auch.

341voto

Dan Punkte 6440

Wenn jemand die Statistiken für jeden Benutzer in ihrem Codebestand sehen möchte, haben ein paar meiner Kollegen kürzlich diese schreckliche Einzeiler-Lösung entwickelt:

git log --shortstat --pretty="%cE" | sed 's/\(.*\)@.*/\1/' | grep -v "^$" | awk 'BEGIN { line=""; } !/^ / { if (line=="" || !match(line, $0)) {line = $0 "," line }} /^ / { print line " # " $0; line=""}' | sort | sed -E 's/# //;s/ Dateien? geändert,//;s/([0-9]+) ([0-9]+ Löschungen)/\1 0 Einfügungen\(+\), \2/;s/\(\+\)$/\(\+\), 0 Löschungen\(-\)/;s/Einfügungen?\(\+\), //;s/ Löschungen?\(-\)//' | awk 'BEGIN {name=""; Dateien=0; Einfügungen=0; Löschungen=0;} {if ($1 != name && name != "") { print name ": " Dateien " Dateien geändert, " Einfügungen " Einfügungen(+), " Löschungen " Löschungen(-), " Einfügungen-Löschungen " netto"; Dateien=0; Einfügungen=0; Löschungen=0; name=$1; } name=$1; Dateien+=$2; Einfügungen+=$3; Löschungen+=$4} END {print name ": " Dateien " Dateien geändert, " Einfügungen " Einfügungen(+), " Löschungen " Löschungen(-), " Einfügungen-Löschungen " netto";}'

(Es dauert einige Minuten, um durch unseren Repository zu laufen, das ungefähr 10-15k Commits hat.)

0 Stimmen

Was bedeutet 'net'?

1 Stimmen

@EugenKonkov im Code ist es als Insertionen - Löschungen definiert.

41 Stimmen

Das ist der einzige Befehl, der das Gesamtergebnis für ein Repository liefert und ohne Plugins ausgeführt wird.

211voto

git-fame

https://github.com/oleander/git-fame-rb

Dies ist ein nützliches Werkzeug, um die Anzahl aller Autoren auf einmal zu erhalten, einschließlich der Anzahl der Commits und geänderten Dateien:

sudo apt-get install ruby-dev
sudo gem install git_fame
cd /pfad/zum/gitverzeichnis && git fame

Es gibt auch eine Python-Version unter https://github.com/casperdcl/git-fame (erwähnt von @fracz):

sudo apt-get install python-pip python-dev build-essential 
pip install --user git-fame
cd /pfad/zum/gitverzeichnis && git fame

Beispiel-Ausgabe:

Gesamtanzahl der Dateien: 2,053
Gesamtanzahl der Zeilen: 63,132
Gesamtanzahl der Commits: 4,330

+------------------------+--------+---------+-------+--------------------+
| name                   | loc    | commits | files | percent            |
+------------------------+--------+---------+-------+--------------------+
| Johan Sørensen         | 22,272 | 1,814   | 414   | 35.3 / 41.9 / 20.2 |
| Marius Mathiesen       | 10,387 | 502     | 229   | 16.5 / 11.6 / 11.2 |
| Jesper Josefsson       | 9,689  | 519     | 191   | 15.3 / 12.0 / 9.3  |
| Ole Martin Kristiansen | 6,632  | 24      | 60    | 10.5 / 0.6 / 2.9   |
| Linus Oleander         | 5,769  | 705     | 277   | 9.1 / 16.3 / 13.5  |
| Fabio Akita            | 2,122  | 24      | 60    | 3.4 / 0.6 / 2.9    |
| August Lilleaas        | 1,572  | 123     | 63    | 2.5 / 2.8 / 3.1    |
| David A. Cuadrado      | 731    | 111     | 35    | 1.2 / 2.6 / 1.7    |
| Jonas Ängeslevä        | 705    | 148     | 51    | 1.1 / 3.4 / 2.5    |
| Diego Algorta          | 650    | 6       | 5     | 1.0 / 0.1 / 0.2    |
| Arash Rouhani          | 629    | 95      | 31    | 1.0 / 2.2 / 1.5    |
| Sofia Larsson          | 595    | 70      | 77    | 0.9 / 1.6 / 3.8    |
| Tor Arne Vestbø        | 527    | 51      | 97    | 0.8 / 1.2 / 4.7    |
| spontus                | 339    | 18      | 42    | 0.5 / 0.4 / 2.0    |
| Pontus                 | 225    | 49      | 34    | 0.4 / 1.1 / 1.7    |
+------------------------+--------+---------+-------+--------------------+

Aber seien Sie gewarnt: Wie Jared in seinem Kommentar erwähnt hat, dauert es bei einem sehr großen Repository Stunden. Ich bin mir nicht sicher, ob dies verbessert werden kann, denn es muss so viele Git-Daten verarbeiten.

2 Stimmen

Hat gut funktioniert auf einem MacBook aus Mitte 2015 und einem mittelgroßen Android-Projekt (127k LoC 'is). Ein paar Minuten.

0 Stimmen

@maxweber Ich habe das auf dem Linux-Kernel ausprobiert :-) Klingt konsistent mit dem, was ich sehe.

0 Stimmen

Was sind die Zahlen in der Prozentspalte?

114voto

mmrobins Punkte 11599

Ich fand das Folgende hilfreich, um zu sehen, wer die meisten Zeilen hatte, die sich derzeit im Code-Bestand befanden:

git ls-files -z | xargs -0n1 git blame -w | ruby -n -e '$_ =~ /^.*\((.*?)\s[\d]{4}/; puts $1.strip' | sort -f | uniq -c | sort -n

Die anderen Antworten haben sich hauptsächlich auf geänderte Zeilen in Commits konzentriert, aber wenn Commits nicht überleben und überschrieben werden, könnten sie einfach nur im Umlauf sein. Die obige Beschwörung gibt Ihnen auch alle Committer sortiert nach Zeilen anstelle von nur einem auf einmal. Sie können einige Optionen zu git blame hinzufügen (-C -M), um bessere Zahlen zu erhalten, die Dateibewegungen und Zeilenbewegungen zwischen Dateien berücksichtigen, aber der Befehl könnte viel länger laufen, wenn Sie das tun.

Wenn Sie außerdem nach geänderten Zeilen in allen Commits für alle Committer suchen, ist das folgende kleine Skript hilfreich:

http://git-wt-commit.rubyforge.org/#git-rank-contributors

41 Stimmen

Ich war kurz davor, eine +1 zu geben, aber dann habe ich realisiert, dass die Lösung von Ruby abhängt... :(

3 Stimmen

Sie könnten es ganz einfach so ändern, dass Ruby nicht verwendet wird, da ich Ruby nur für den Zeichenaustausch verwende. Sie könnten Perl, Sed, Python usw. verwenden.

0 Stimmen

@mmrobins stackoverflow.com/questions/4589731/git-blame-statistics es gibt auch eine Nicht-Ruby-Version

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