Quali statistiche di commit di Git sono facili da estrarre


90

In precedenza mi è piaciuta la capacità di TortoiseSvn di generare semplici statistiche di commit per un dato repository SVN. Mi chiedo cosa sia disponibile in Git e sono particolarmente interessato a:

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

Qualche idea?

Risposte:


197

In realtà, git ha già un comando per questo:

git shortlog

nel tuo caso, sembra che tu sia interessato a questo modulo:

git shortlog -sne

Vedere le --helpvarie opzioni.

Potresti anche essere interessato al progetto GitStats . Hanno alcuni esempi, comprese le statistiche per il progetto Git . Dalla pagina principale di GitStat:

Ecco un elenco di alcune statistiche generate attualmente:

  • Statistiche generali: file totali, righe, commit, 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 degli autori (nome, commit (%), data del primo commit, data dell'ultimo commit, età), autore del mese, autore dell'anno.
  • File: conteggio file per data, estensioni
  • Righe: righe di codice per data

1
Questo e 'esattamente quello che stavo cercando. È incredibile che tu possa effettivamente sostituire le righe di codice nel mio esempio con "git shortlog -sn" Vota per questa risposta
Jesper Rønn-Jensen

13
git shortlog -sn --no-mergesrimuovere anche "merge commit" dal conteggio.
lbolla

4
febbraio 2010: Linus attacca!
nought101

25

Innanzitutto, non devi tirare nulla (come nel pull di rete), perché hai l'intero repository e l'intera cronologia localmente. Sono abbastanza sicuro che ci siano strumenti che ti forniranno statistiche, ma a volte puoi semplicemente essere creativo con le righe di comando. Ad esempio, questo (appena fuori dalla mia testa) ti 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 richiesto potrebbero richiedere più riflessione. Potresti voler vedere gli strumenti disponibili. Cercando su Google git statisticspunti per lo GitStatsstrumento, con cui non ho esperienza e ancor meno idea di cosa sia necessario per farlo funzionare su Windows, ma puoi provare.



4
git shortlogè davvero il comando giusto qui, ma anche senza di esso, il complesso comando awk sopra può essere sostituito da| sort | uniq -c
Josch

È vero, @josch.
Michael Krelin - hacker

7

Lo strumento migliore finora che ho identificato è gitinspector. Fornisce il rapporto impostato per utente, per settimana ecc

Puoi installare come di seguito con npm

npm install -g gitinspector

I dettagli per ottenere i collegamenti sono di seguito

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

i comandi di esempio sono

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

eccetera


5

Grazie all'hacker per aver risposto a questa domanda. Tuttavia, ho trovato queste versioni modificate migliori per il mio utilizzo particolare:

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

(usando awk perché non ho gawk sul mio Mac e ordinamento con il comitter più attivo in cima.) Produce un elenco 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

Non avevo idea che tu abbia un Mac - la menzione della tartaruga mi ha fatto pensare alle finestre. Ma comunque, sono contento che tu abbia trovato la tua strada. Il mio frammento era solo un esempio e un punto di partenza.
Michael Krelin - hacker,

2
Questo deve essere sort -rn.
hughdbrown

@hughdbrown, per me, -nnon è necessario in sort -rn. Uso un Mac, ma "sort numeric" semplicemente non fa differenza per gli esempi che ho provato
Jesper Rønn-Jensen

qual è la differenza tra questo e git shortlog -sn?
Pejman

2

Ecco i modi per ottenere statistiche per un ramo specifico o due hash.

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

Di seguito sto usando il primo hash da un ramo a HEAD che è la fine di quel ramo.

Mostra i commit totali in un ramo

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

Mostra i commit totali per autore

  • git shortlog FIRST_HASH..HEAD -sne
  • Produzione
  • 24 Nome dell'autore
  • 9 Nome dell'autore


2

Ho scritto un piccolo script di shell che calcola le statistiche di unione (utile quando si ha a che fare con 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

Inoltre, se stai utilizzando il sistema di richiesta pull di GitHub, ho scritto github-pr-stats , che fornisce molti più dati rispetto a git-merge-stats e ha persino un sistema di plug-in che ti consente di integrarti nelle analisi specifiche della tua azienda.
Xiong Chiamiov


1

Ecco un semplice script ruby ​​che ho usato per ottenere l'autore, le righe aggiunte, le righe rimosse e il conteggio dei commit da 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. Puoi inserire quanto segue 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")


0

Puoi utilizzare gitlogged gem ( https://github.com/dexcodeinc/gitlogged ) per ottenere attività per autore e data. Questo ti darà un rapporto come questo:

gitlogged 2016-04-25 2016-04-26

che restituisce il seguente output

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

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

0

Se utilizzi GitHub, PR Count è un'app GitHub creata per mostrare le statistiche sui contributi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.