2009-09-28 10 views
77

In precedenza mi è piaciuta la capacità di TortoiseSvn di generare statistiche di commit semplici per un determinato repository SVN. Mi chiedo che cosa è disponibile in Git e sono particolarmente interessato a:Quali statistiche di commit Git sono facili da estrarre

  • Numero di commit per utente
  • Numero di linee modificate per utente
  • attività nel tempo (ad esempio cambi settimanali aggregate)

Qualche idea?

risposta

168

in realtà, Git ha già un comando per questo:

git shortlog 

nel tuo caso, suona come siete interessati a questa forma:

git shortlog -sne 

Vedere --help per varie opzioni.

Potresti anche essere interessato allo GitStats project. Hanno alcuni esempi, incluso lo stats for the Git project. Dalla pagina principale GitStat:

Ecco una lista di alcune statistiche generate attualmente:

  • statistiche generali: i file totali, linee, impegna, autori.
  • Attività: esegue il commit per ora del giorno, giorno della settimana, ora della settimana, mese dell'anno, anno e mese e anno.
  • Autori: elenco di autori (nome, commit (%), prima data di commit, ultima data di commit, età), autore del mese, autore dell'anno.
  • Files: conteggio dei file in base alla data, estensioni
  • Lines: righe di codice per data
+1

Questo è esattamente quello che stavo cercando. Incredibile che sia possibile sostituire le righe di codice nel mio esempio con "git shortlog -sn" Vota questa risposta –

+12

anche "git shortlog -sn --no-merges" rimuovi "merge commit" dal conteggio. – lbolla

+4

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

23

Innanzitutto, non è necessario pull qualsiasi cosa (come in pull di rete), perché si dispone dell'intero repository e dell'intera cronologia localmente. Sono abbastanza sicuro che ci siano strumenti che ti forniranno statistiche, ma a volte puoi semplicemente essere creativo con le linee di comando. Per esempio, questo (appena fuori dalla mia testa) vi darà il numero di commit per utente:

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

Altre statistiche che hai chiesto potrebbe essere necessario più pensiero messo in esso. Potresti voler vedere gli strumenti disponibili. Googling per git statistics punti allo strumento GitStats, che non ho esperienza con e ancora meno idea di quello che serve per farlo funzionare su Windows, ma puoi provare.

+5

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

+0

non c'è bisogno di gawk qui –

+4

' git shortlog' è davvero il comando giusto qui ma anche senza di esso, il comando awk complesso sopra può essere ripetuto da '| ordinare | uniq -c' – josch

6

Grazie all'hacker per aver risposto a questa domanda. Tuttavia, ho trovato queste versioni modificate per essere meglio per la mia particolare uso:

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

(. Utilizzando awk come non ho gawk sul mio Mac, e l'ordinamento con comitter più attivo in alto) viene emesso un lista in questo modo:

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

Non avevo idea che tu avessi un Mac, menzionare la tartaruga mi ha fatto pensare alle finestre. Ma comunque, sono felice che tu abbia trovato la tua strada. Il mio frammento era solo un esempio e un punto di partenza. –

+1

Questo deve essere 'sort -rn'. – hughdbrown

+0

@hughdbrown, per me, '-n' non è necessario in' sort -rn'. Io uso un mac, ma "sort numeric" non fa alcuna differenza per gli esempi che ho provato –

2

Qui ci sono modi per ottenere statistiche di un ramo specifico o due hash.

chiave qui è la capacità di fare HASH..HASH

Sotto sto usando il primo hash da un ramo alla testa che è la fine di quel ramo.

Mostra impegna totali in un ramo

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

Mostra commit totali per autore

  • git shortlog FIRST_HASH..HEAD -sne
  • uscita
  • 24 Autore Nome
  • 9 Autore Nome
1

Ecco un semplice script Ruby che ho usato per ottenere autore, linee, linee rimosso, e commit count from git. Non copre i commit nel tempo.

Nota che ho un trucco in cui ignora qualsiasi commit che aggiunge/rimuove più di 10.000 righe perché presumo che si tratti di un'importazione di codice di qualche tipo, sentiti libero di modificare la logica per le tue esigenze. È possibile inserire il seguito in un file chiamato gitstats-simple.rb e quindi eseguire

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

contenuto di 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

ho scritto a small shell script che calcola unire le statistiche (utile quando si gestione di un flusso di lavoro basato su feature-branch). Ecco un esempio di output su un piccolo 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

Inoltre, se stai usando Il sistema di richiesta pull di GitHub, ho scritto [github-pr-stats] (https://github.com/xiongchiamiov/github-pr-stats), che fornisce molti più dati di git-merge-stats e ha anche un sistema di plugin per ti consente di integrarti nelle analisi specifiche della tua azienda. –

0

È possibile utilizzare gemma gitlogged (https://github.com/dexcodeinc/gitlogged) per ottenere le attività per autore e data. Questo vi darà relazione come questa:

gitlogged 2016-04-25 2016-04-26 

che restituisce l'output seguente

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

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

Modifica https://stackoverflow.com/a/18797915/3243930 . l'output è molto vicino ai dati del grafico di github.

#!/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

Lo strumento migliore finora identificato è gitinspector. E dare il rapporto impostato per utente, a settimana ecc

È possibile installare come di seguito con NPM

npm install -g gitinspector 

dettagli per ottenere i collegamenti sono al di sotto

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

comandi di esempio sono

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

ecc

Problemi correlati