Welche Git-Commit-Statistiken sind einfach zu ziehen


90

Zuvor hat mir TortoiseSvns Fähigkeit gefallen, einfache Commit-Statistiken für ein bestimmtes SVN-Repository zu generieren. Ich frage mich, was in Git verfügbar ist und bin besonders interessiert an:

  • Anzahl der Commits pro Benutzer
  • Anzahl der pro Benutzer geänderten Zeilen
  • Aktivität im Zeitverlauf (z. B. aggregierte wöchentliche Änderungen)

Irgendwelche Ideen?

Antworten:


197

Tatsächlich hat git bereits einen Befehl dafür:

git shortlog

In Ihrem Fall scheint Sie an diesem Formular interessiert zu sein:

git shortlog -sne

Siehe die --helpfür verschiedene Optionen.

Sie könnten auch am GitStats-Projekt interessiert sein . Sie haben einige Beispiele, einschließlich der Statistiken für das Git-Projekt . Von der GitStat-Hauptseite:

Hier ist eine Liste einiger Statistiken, die derzeit erstellt werden:

  • Allgemeine Statistiken: Gesamtzahl der Dateien, Zeilen, Commits, Autoren.
  • Aktivität: Festschreibung nach Tageszeit, Wochentag, Wochenstunde, Monat des Jahres, Jahr und Monat und Jahr.
  • Autoren: Liste der Autoren (Name, Commits (%), erstes Commit-Datum, letztes Commit-Datum, Alter), Autor des Monats, Autor des Jahres.
  • Dateien: Anzahl der Dateien nach Datum, Erweiterungen
  • Zeilen: Codezeilen nach Datum

1
Genau das habe ich gesucht. Erstaunlich, dass Sie die Codezeilen in meinem Beispiel tatsächlich durch "git shortlog -sn" ersetzen können. Stimmen Sie für diese Antwort ab
Jesper Rønn-Jensen

13
auch git shortlog -sn --no-mergesentfernen „Merge Commits“ von der Zählung.
lbolla

4
Februar 2010: Linus greift an!
naught101

25

Zuerst müssen Sie sich nicht zu ziehen etwas (wie im Netzwerk pull), weil Sie das ganze Repository und die ganze Geschichte vor Ort haben. Ich bin mir ziemlich sicher, dass es Tools gibt, die Ihnen Statistiken liefern, aber manchmal können Sie einfach mit den Befehlszeilen kreativ sein. Dies gibt Ihnen beispielsweise (nur aus meinem Kopf heraus) die Anzahl der Commits pro Benutzer:

git log --pretty=format:%ae \
| gawk -- '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }'

Andere Statistiken, nach denen Sie gefragt haben, müssen möglicherweise genauer untersucht werden. Möglicherweise möchten Sie die verfügbaren Tools anzeigen. Googeln nach git statisticsPunkten für das GitStatsTool, mit denen ich keine Erfahrung habe und noch weniger Ahnung, was es braucht, um es unter Windows zum Laufen zu bringen, aber Sie können es versuchen.



4
git shortlogist in der Tat der richtige Befehl hier, aber auch ohne ihn kann der komplexe awk-Befehl oben durch| sort | uniq -c
josch

Das stimmt, @josch.
Michael Krelin - Hacker

7

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

Details, um die Links zu erhalten, sind unten

https://www.npmjs.com/package/gitinspector
https://github.com/ejwa/gitinspector/wiki/Documentation
https://github.com/ejwa/gitinspector

Beispielbefehle sind

gitinspector -lmrTw
gitinspector --since=1-1-2017

etc


5

Vielen Dank an Hacker für die Beantwortung dieser Frage. Ich fand jedoch, dass diese modifizierten Versionen für meine spezielle Verwendung besser sind:

git log --pretty=format:%an \
| awk '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }'\
| sort -r

(Verwenden von awk, da ich auf meinem Mac kein Gawk habe, und Sortieren mit dem aktivsten Comitter oben.) Es gibt eine Liste wie folgt aus:

 1205 therikss
 1026 lsteinth
  771 kmoes
  720 minielse
  507 pagerbak
  269 anjohans
  205 mfoldbje
  188 nstrandb
  133 pmoller
   58 jronn
   10 madjense
    3 nlindhol
    2 shartvig
    2 THERIKSS

Ich hatte keine Ahnung, dass Sie einen Mac haben - die Erwähnung von Schildkröte ließ mich an Fenster denken. Trotzdem bin ich froh, dass Sie Ihren Weg gefunden haben. Mein Snippet war nur ein Beispiel und ein Ausgangspunkt.
Michael Krelin - Hacker

2
Das muss sein sort -rn.
Hughdbrown

@hughdbrown ist für mich in -nnicht notwendig sort -rn. Ich benutze einen Mac, aber "numerisch sortieren" macht für die Beispiele, die ich ausprobiert habe, einfach keinen Unterschied
Jesper Rønn-Jensen

Was ist der Unterschied zwischen diesem und git shortlog -sn?
Pejman

2

Hier finden Sie Möglichkeiten, um Statistiken für einen bestimmten Zweig oder zwei Hashs abzurufen.

Der Schlüssel hier ist die Fähigkeit, HASH..HASH zu machen

Unten verwende ich den ersten Hash von einem Zweig zum HEAD, der das Ende dieses Zweigs darstellt.

Gesamte Commits in einem Zweig anzeigen

  • Git-Protokoll FIRST_HASH..HEAD --pretty = oneline | wc -l
  • Ausgabe 53

Gesamte Commits pro Autor anzeigen

  • Git Shortlog FIRST_HASH..HEAD -sne
  • Ausgabe
  • 24 Autorenname
  • 9 Autorenname


2

Ich habe ein kleines Shell-Skript geschrieben , das Zusammenführungsstatistiken berechnet (nützlich, wenn es sich um einen funktionszweigbasierten Workflow handelt). Hier ist eine Beispielausgabe in einem kleinen Repository:

[$]> git merge-stats
% of Total Merges               Author  # of Merges  % of Commits
            57.14     Daniel Beardsley            4          5.63
            42.85        James Pearson            3         30.00

Wenn Sie das Pull-Request-System von GitHub verwenden, habe ich github-pr-stats geschrieben , das viel mehr Daten als git-merge-stats liefert und sogar über ein Plugin-System verfügt, mit dem Sie sich in Ihre eigenen unternehmensspezifischen Analysen integrieren können.
Xiong Chiamiov


1

Hier ist ein einfaches Ruby-Skript, mit dem ich den Autor, die hinzugefügten Zeilen, die entfernten Zeilen und die Anzahl der Festschreibungen von git abgerufen habe. Commits im Zeitverlauf werden nicht abgedeckt.

Beachten Sie, dass ich einen Trick habe, bei dem jedes Commit ignoriert wird, das mehr als 10.000 Zeilen hinzufügt / entfernt, da ich davon ausgehe, dass es sich um einen Codeimport handelt. Sie können die Logik jederzeit an Ihre Bedürfnisse anpassen. Sie können das Folgende in eine Datei namens gitstats-simple.rb einfügen und dann ausführen

git log --numstat --pretty='%an' | ruby gitstats-simple.rb

Inhalt von gitstats-simple.rb

#!/usr/bin/ruby

# takes the output of this on stdin: git log --numstat --prety='%an'

map = Hash.new{|h,k| h[k] = [0,0,0]}
who = nil
memo = nil
STDIN.read.split("\n").each do |line|
  parts = line.split
  next if parts.size == 0
  if parts[0].match(/[a-z]+/)
    if who && memo[0] + memo[1] < 2000
      map[who][0] += memo[0]
      map[who][1] += memo[1]
      map[who][2] += 1
    end
    who = parts[0]
    memo = [0,0]
    next
  end
  if who
    memo[0]+=line[0].to_i
    memo[1]+=parts[1].to_i
  end
end

puts map.to_a.map{|x| [x[0], x[1][0], x[1][1], x[1][2]]}.sort_by{|x| -x[1] - x[2]}.map{|x|x.inspect.gsub("[", "").gsub("]","")}.join("\n")


0

Sie können gitlogged gem ( https://github.com/dexcodeinc/gitlogged ) verwenden, um Aktivitäten nach Autor und Datum abzurufen . Dies gibt Ihnen einen Bericht wie folgt:

gitlogged 2016-04-25 2016-04-26

Dies gibt die folgende Ausgabe zurück

################################################################

Date: 2016-04-25

Yunan (4):
      fix attachment form for IE (#4407)
      fix (#4406)
      fix merge & indentation attachment form
      fix (#4394) unexpected after edit wo

gilang (1):
      #4404 fix orders cart


################################################################
################################################################

Date: 2016-04-26

Armin Primadi (2):
      Fix document approval logs controller
      Adding git tool to generate summary on what each devs are doing on a given day for reporting purpose

Budi (1):
      remove validation user for Invoice Processing feature

Yunan (3):
      fix attachment in edit mode (#4405) && (#4430)
      fix label attachment on IE (#4407)
      fix void method (#4427)

gilang (2):
      Fix show products list in discussion summary
      #4437 define CApproved_NR status id in order


################################################################

0

Ändern Sie https://stackoverflow.com/a/18797915/3243930 . Die Ausgabe ist den Graphendaten von Github sehr nahe.

#!/usr/bin/ruby

# takes the output of this on stdin: git log --numstat --prety='%an'

map = Hash.new{|h,k| h[k] = [0,0,0]}
who = nil
memo = nil
STDIN.read.split("\n").each do |line|
  parts = line.split("\t")
  next if parts.size == 0
  if parts[0].match(/[a-zA-Z]+|[^\u0000-\u007F]+/)
    if who
      map[who][0] += memo[0]
      map[who][1] += memo[1]
      if memo[0] > 0 || memo[1] > 0 
        map[who][2] += 1
      end
    end
    who = parts[0]
    memo = [0,0]
    next
  end
  if who
    memo[0]+=parts[0].to_i
    memo[1]+=parts[1].to_i
  end
end

puts map.to_a.map{|x| [x[0], x[1][0], x[1][1], x[1][2]]}.sort_by{|x| -x[1] - x[2]}.map{|x|x.inspect.gsub("[", "").gsub("]","")}.join("\n")

0

Wenn Sie Github verwenden, ist PR Count eine Github-App, mit der Beitragsstatistiken angezeigt werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.