2011-01-04 3 views
38

Ho un repository GIT e voglio calcolare quante righe di codice sono state aggiunte/modificate da una persona o da un gruppo di persone durante un certo periodo di tempo. È possibile calcolare con git?Git: come stimare un contributo di una persona al mio progetto in termini di linee di codice aggiunte/modificate?

+2

Non utilizzare questo per la stima "performance" btw, vedi http: // blogs .msdn.com/b/oldnewthing/archive/2010/11/16/10091537.aspx – ismail

+1

Grazie per il tuo commento, non avevo nessuna intenzione di misurare lo stipendio di una persona con questo tipo di misura. Questo sarà fatto per avere il quadro completo del lavoro di una persona, e nessuno saprà mai che quel che sto facendo uno – Lu4

+3

Non è la dimensione delle linee, è come si utilizzano. – ingyhere

risposta

69

È possibile utilizzare git log e alcuni shell-fu:

git log --shortstat --author "Aviv Ben-Yosef" --since "2 weeks ago" --until "1 week ago" \ 
    | grep "files\? changed" \ 
    | awk '{files+=$1; inserted+=$4; deleted+=$6} END \ 
      {print "files changed", files, "lines inserted:", inserted, "lines deleted:", deleted}' 

Spiegazione: git log --shortstat visualizza una statistica breve di ogni commit, che, tra le altre cose, mostra il numero di file modificati, righe inserite e cancellate. Possiamo quindi filtrarlo per un committer specifico (--author "Your Name") e un intervallo di tempo (--since "2 weeks ago" --until "1 week ago").

Ora, per riassumere effettivamente le statistiche anziché vedere la voce per commit, eseguiamo alcuni script di shell per farlo. Innanzitutto, utilizziamo grep per filtrare solo le righe con le differenze. Queste linee appaiono così:

8 files changed, 169 insertions(+), 81 deletions(-) 

o questo:

1 file changed, 4 insertions(+), 4 deletions(-) 

Abbiamo poi sommiamo questi utilizzando awk: per ogni linea aggiungiamo i file modificati (prima parola), le linee inserite (4a parola) e righe cancellate (sesta parola) e poi stamparle dopo aver sommato tutto.

Modifica: le barre in avanti sono state aggiunte nello snippet superiore in modo che possa essere copiata e incollata in una riga di comando.

+1

Penso che sia necessario "=" tra il --author e --since e --until –

+0

Grazie per quello! L'ho ottimizzato un po 'e ne ho fatto una funzione shell. E 'disponibile qui: https://gist.github.com/pstadler/4722416 – pstadler

+4

Questa grande opera finché ci sono inserimenti. Nel caso in cui ci sarebbero solo cancellazioni, conterebbero come inserimenti, perché la quarta parola su '8 file modificati, 81 delezioni' è la cancellazione, non l'inserimento. –

16

È possibile generare statistiche utilizzando Gitstats. Ha una sezione "Autori" che include il numero di linee aggiunte/rimosse dai primi 20 autori (20 per numero di commit).

Edit: C'è anche Git: Blame Statistics

3

Per particolari date, è possibile utilizzare --since "2012-08-27" --until "2012-09-01"

Come

git log --shortstat --author "Fabian" --since "2012-08-27" --until "2012-09-01" | grep "file modificati" | awk '{files + = $ 1; inserita + = $ 4; cancellato + = $ 6} END {print "file cambiato", i file, "le linee inserite:", inserita, "le linee cancellate:", cancellati}'

controllare questa spiegazione

http://gitref.org/inspect/

1

Puoi provare Atlassian's Fisheye/Crucible che si integra con Git (così come altri repository di codice). Quindi i contributi di tutti - compreso il loro LOC - vengono visualizzati pubblicamente in un'app Web facilmente leggibile. Anche per piccoli gruppi è abbastanza economico.

Aprire l'informazione e lasciarlo parlare da solo.

+0

fisheye al momento non supporta le metriche LOC su GIT o sugli archivi mercuriali purtroppo. Solo SVN sembra essere supportato per queste statistiche. https://confluence.atlassian.com/display/FISHEYE/Cannot+View+Lines+of+Code+Information+in+FishEye –

+0

Ouch! Sono corretto. Anche la mia fiducia in Atlassian è un po 'scossa. – ingyhere

+0

Le ultime versioni di Fisheye ora supportano Git! – ingyhere

0

eseguire questo comando:

git log --pretty=format:'' --numstat --author 'Lu4' | awk 'NF' | awk '{insertions+=$1; deletions+=$2} END {print NR, "files changed,", insertions, "insertions(+),", deletions, "deletions(+)"}'; 

Questo comando è molto vicina a quella intelligente nella abyx's answer, ma gestisce anche il caso limite trovata da Wallace Sidhrée. A volte, un commit comporta solo cancellazioni (cioè, nessun inserimento). Il comando in abyx's answer legge erroneamente tali eliminazioni come inserimenti. Il comando qui li legge correttamente perché utilizza --numstat anziché --shortstat. A differenza --shortstat, --numstat include sia gli inserimenti ed eliminazioni per quelle commit.

Si noti che entrambi i comandi includono file binari nel conteggio dei file, ma escludono il numero di linee inserite e cancellate all'interno di questi binari.


Ecco un altro trucco utile. Creare un file denominato gitstats con questo contenuto:

#!/usr/bin/env bash 

git log --pretty=format:'' --numstat "[email protected]" | awk 'NF' | awk '{insertions+=$1; deletions+=$2} END {print NR, "files changed,", insertions, "insertions(+),", deletions, "deletions(+)"}'; 

Quindi è possibile eseguire quel comando con tutte le opzioni in più per git log si desidera. Ecco alcuni esempi:

./gitstats; 
./gitstats --since '1 month ago'; 
./gitstats --since '1 month ago' --until '1 day ago'; 
./gitstats --author 'Lu4' --since '1 month ago' --until '1 day ago'; 

(Il file può essere chiamato qualcosa di diverso gitstats, naturalmente.)

Problemi correlati