2009-09-28 6 views
77

Zuvor hatte ich TortoiseSvn's Fähigkeit genossen, einfache Commit-Statistiken für ein gegebenes SVN-Repository zu generieren. Ich frage mich, was in Git verfügbar ist und interessiere mich besonders für:Welche Git-Commit-Statistiken sind einfach zu ziehen

  • Anzahl der Commits pro Benutzer
  • Anzahl der Zeilen pro Benutzer
  • Aktivität im Laufe der Zeit verändert (zum Beispiel aggregiert wöchentlichen Veränderungen)

Irgendwelche Ideen?

Antwort

168

Eigentlich git bereits einen Befehl für diese hat:

git shortlog 

in Ihrem Fall, es klingt wie Sie in dieser Form interessiert sind:

git shortlog -sne 

Siehe die --help für verschiedene Optionen. Sie können außerdem Interesse an dem GitStats project haben. Sie haben ein paar Beispiele, einschließlich der stats for the Git project. Von der GitStat Hauptseite:

Hier ist eine Liste von einigen gegenwärtig erzeugten Statistiken:

  • Allgemeine Statistiken: Alle Dateien, Linien, verpflichtet, Autoren.
  • Aktivität: verpflichtet nach Stunde des Tages, Wochentag, Stunde der Woche, 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: Dateianzahl nach Datum, Erweiterungen
  • Linien: Lines of Code von
  • Datum
+1

Genau das habe ich gesucht. Erstaunlich, dass Sie die Codezeilen in meinem Beispiel tatsächlich durch "git shortlog -sn" ersetzen können. Für diese Antwort abstimmen –

+12

auch 'git shortlog -sn --no-merges' entfernen" merge commits "aus der Zählung. – lbolla

+4

Februar 2010: [Linus Angriffe!] (Http://gitstats.sourceforge.net/examples/git/authors.html#cumulated_added_lines_of_code_per_author) – naught101

23

Zuerst müssen Sie nicht ziehen irgendetwas (wie im Netzwerk ziehen), weil Sie das gesamte Repository und die gesamte Geschichte lokal 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. Zum Beispiel diese (nur aus dem Kopf) geben Sie 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 Sie gefragt mehr Gedanken müssen in sie setzen. Möglicherweise möchten Sie die verfügbaren Tools sehen. Googeln für git statistics Punkte auf das GitStats Werkzeug, mit dem ich keine Erfahrung habe und noch weniger Ahnung davon, was es braucht, um es unter Windows laufen zu lassen, aber man kann es versuchen.

+5

'git shortlog -s -n' (aus http://stackoverflow.com/questions/1828874/generating-statistics-from-git-repository) – naught101

+0

keine Notwendigkeit für gawk hier –

+4

' git shortlog' ist in der Tat der richtige Befehl hier Aber auch ohne sie kann der obige Befehl "awk" durch '| ersetzt werden sortieren | uniq -c' – josch

6

Dank Hacker für die Beantwortung dieser Frage. Allerdings fand ich diese modifizierten Versionen für meine besondere Nutzung besser zu sein:

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

(. Mit awk als ich auf meinem Mac nicht gaffen haben, und mit den meisten aktiven comitter auf Sortierung) Es gibt ein Liste wie folgt:

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 
+0

Ich hatte keine Ahnung, dass du Mac hast - Erwähnung von Schildkröte ließ mich an Fenster denken. Aber wie auch immer, ich bin froh, dass du deinen Weg gefunden hast. Mein Ausschnitt war nur ein Beispiel und ein Ausgangspunkt. –

+1

Dies muss "sort -rn" sein. – hughdbrown

+0

@hughdbrown, für mich ist '-n' nicht notwendig in' sort -rn'. Ich benutze einen Mac, aber "sortiere numerisch" macht einfach keinen Unterschied für die Beispiele, die ich ausprobiert habe. –

2

Hier Wege sind Statistiken für einen bestimmten Zweig zu erhalten oder zwei Hashs.

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

zu tun Im Folgenden werde ich von einem Ast zum HEAD den ersten Hash bin mit der das Ende dieses Zweiges ist.

anzeigen insgesamt Commits in einem Zweig

  • git log FIRST_HASH..HEAD --pretty = oneline | wc -l
  • Ausgabe 53

anzeigen insgesamt Commits pro Autor

  • git shortlog FIRST_HASH..HEAD -sne
  • Ausgabe
  • 24 Author Name
  • 9 Autor Name
1

Hier ist ein einfacher Ruby-Skript, das ich verwenden, Autor zu bekommen, Zeilen hinzugefügt, Linien entfernt, und commit count von git. Es deckt nicht im Laufe der Zeit Commits.

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 dies ein Code-Import ist. Sie können die unten in eine Datei mit dem Namen gitstats-simple.rb setzen und dann

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

Inhalt 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") 
2

ich geschrieben habe a small shell script ausführen, die Statistiken fusionieren berechnet (nützlich, wenn Umgang mit einem Feature-Zweig-basierten Workflow). Hier ist ein Beispiel für die Ausgabe auf 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 
+0

Auch, wenn Sie verwenden GitHubs Pull-Request-System, schrieb ich [github-pr-stats] (https://github.com/xiongchiamiov/github-pr-stats), das viel mehr Daten als git-merge-stats bietet und sogar über ein Plugin-System verfügt ermöglichen Ihnen die Integration in eigene unternehmensspezifische Analysen. –

0

Sie gitlogged gem verwenden können (https://github.com/dexcodeinc/gitlogged) Aktivitäten zu erhalten, indem Autor und Datum. Dies wird Ihnen wie folgt berichten:

gitlogged 2016-04-25 2016-04-26 

, die die folgende Ausgabe

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

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 https://stackoverflow.com/a/18797915/3243930 zurückgibt. Die Ausgabe ist für die Graphdaten von GitHub sehr geschlossen.

#!/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") 
4

Das beste Werkzeug, das ich bisher identifiziert habe, ist gitispector. Es gibt den Satz Bericht pro Benutzer, pro Woche etc

Sie mögen unten mit npm

npm install -g gitinspector 

Einzelheiten installieren können die Links sind unter

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

Beispiel Befehle

gitinspector -lmrTw 
gitinspector --since=1-1-2017 
zu bekommen sind

usw.

Verwandte Themen