Come ottengo il conteggio dei commit di Git?


753

Vorrei ottenere il numero di commit del mio repository Git, un po 'come i numeri di revisione SVN.

L'obiettivo è utilizzarlo come un numero di build univoco e incrementale.

Attualmente mi piace così, su Unix / Cygwin / msysGit:

git log --pretty=format:'' | wc -l

Ma sento che è un po 'un trucco.

C'è un modo migliore per farlo? Sarebbe bello se in realtà non avessi bisogno wco addirittura Git, quindi potrebbe funzionare su un Windows nudo. Basta leggere un file o una struttura di directory ...



190
git rev-list HEAD --count git rev-list
Jake Berger,

14
@jberger: penso che il tuo commento dovrebbe essere convertito in una risposta.
utapyngo,

@utapyngo: date le altre 13 risposte, sapevo che sarebbe stato sepolto. L'ho pubblicato qui allora.
Jake Berger,

@jberger, questa risposta non funziona per git1.7.0.
Vorac,

Risposte:


1160

Per ottenere un commit conteggio per una revisione ( HEAD, master, un commit hash):

git rev-list --count <revision>

Per ottenere il conteggio dei commit in tutti i rami:

git rev-list --all --count

Sconsiglio di utilizzarlo per l'identificatore di build, ma se è necessario, probabilmente è meglio usare il conteggio per il ramo su cui stai costruendo. In questo modo la stessa revisione avrà sempre lo stesso numero. Se si utilizza il conteggio per tutti i rami, l'attività su altri rami potrebbe modificare il numero.


27
git shortlog | grep -E '^[ ]+\w+' | wc -lse si desidera ottenere il numero totale e git shortlog | grep -E '^[^ ]'se si desidera ottenere il numero di commit per ogni collaboratore.
skalee,

2
Grazie per averlo segnalato wc -l. Minimalismo FTW. L'ho incorporato nella mia risposta.
Benjamin Atkin,

17
Questa soluzione è al tempo stesso confusa (simile git log --pretty=format:'' | wc -lall'approccio dato nella domanda originale) e non corretta: lo si può vedere capovolgendo la corrispondenza ( git shortlog | grep -Ev '^[ ]+\w+') e vedendo che ad es. I commit senza messaggio (ovvero "<none>") non vengono conteggiati. L'uso git rev-list HEAD --countè sia più breve che più preciso.
ctrueden

17
@BenAtkin: le mie scuse; non era mia intenzione essere offensivo, ma solo fattuale. Punto preso circa la data della risposta. Al momento, la tua soluzione potrebbe benissimo essere stata la migliore disponibile. Ma ora sostengo la mia affermazione che git rev-list HEAD --countè una soluzione migliore.
ctrueden,

3
Aggiunta anche una risposta e funziona anche con le versioni precedenti:git log --oneline | wc -l
Jimmy Kane,

155

git shortlog è un modo.


5
Ty. Questo ha funzionato per me quando contavo i commit in un intervallo; git shortlog sha1..sha2
RJFalconer

1
Sì, la prima riga del shortlog di git contiene il numero di commit in essa contenuti. Problema risolto.
Robert Massaioli,

5
Il numero di commit è raggruppato per committer, non così buono. Può contare le righe nel shortlog di git, ma questo non funziona su ssh senza un terminale per qualche motivo (cercapersone?). La soluzione originale del richiedente è la migliore! git log --pretty = format: '' | wc -l
Sam Watkins

4
Tuttavia, suggerirei git rev-list HEAD --countpiuttosto che l'approccio originale indicato nel PO. Nei miei test, git log --pretty=format:'' | wc -lè spento da uno.
ctrueden

3
@ctrueden git log --oneline | wc -lnon è spento da uno (OS X 10.8.5).
Andy Stewart,

111

git rev-list HEAD --count

git rev-list

git rev-list <commit>: Elenca i commit che sono raggiungibili seguendo i link principali del commit dato (in questo caso, HEAD ).

--count : Stampa un numero che indica quanti commit sarebbero stati elencati e sopprime tutti gli altri output.


101

Questo comando restituisce il conteggio dei commit raggruppati per commit:

git shortlog -s

Produzione:

14 John lennon
9  Janis Joplin

Potresti voler sapere che l' -sargomento è la forma di contrazione di --summary.


11
git shortlogdi per sé non affronta la domanda originale sul numero totale di commit (non raggruppati per autore). Usa git rev-list HEAD --countinvece.
ctrueden

5
Eccezionale! È possibile ordinare dal | sort -ntroppo
Mohsen

54

Se stai cercando un identificatore univoco e ancora abbastanza leggibile per i commit, git descrivere potrebbe essere la cosa giusta per te.


2
Potrebbe funzionare e sarebbe più facile da usare di un algoritmo personalizzato. +1
VonC

2
Non sapevo che Git descrivesse. Questo piccolo numero tra il nome del tag e sha1 è proprio quello che stavo cercando. Grazie.
Splo

2
Dai un'occhiata allo script GIT-VERSION-GEN e al modo in cui viene utilizzato nel repository git e allo script simile nei sorgenti del kernel Linux (e come vengono utilizzati in Makefile).
Jakub Narębski,

Questo dà un ID unico, ma NON INCREMENTALE. Non funziona per me. Tuttavia, la risposta di Ben Atkin offre il conteggio dei commit, che in pratica dovrebbe essere incrementale. La risposta di Aaron Digulla è più sicura, ma richiede anche più lavoro.
JOM

2
Sì, è perché il concetto di ID incrementale non ha alcun senso con i sistemi di controllo della versione distribuita.
Bombe,

34

Non sei il primo a pensare a un "numero di revisione" in Git , ma ' wc' è abbastanza pericoloso, poiché il commit può essere cancellato o schiacciato e la storia rivisitata.

Il "numero di revisione" era particolarmente importante per Subversion poiché era necessario in caso di unione (SVN1.5 e 1.6 sono migliorati su quel fronte).

Potresti finire con un hook pre-commit che includerebbe un numero di revisione nel commento, con un algoritmo che non comporta la ricerca di tutta la cronologia di un ramo per determinare il numero corretto.

Bazaar in realtà ha escogitato un tale algoritmo , e potrebbe essere un buon punto di partenza per quello che vuoi fare.

(Come sottolinea la risposta di Bombe , Git ha in realtà un proprio algoritmo, basato sull'ultimo tag, più il numero di commit, oltre a un po 'di un tasto SHA-1). Dovresti vedere (e votare) la sua risposta se funziona per te.


Per illustrare l'idea di Aaron , puoi anche aggiungere l'hash di commit Git nel file "info" di un'applicazione che stai distribuendo con la tua applicazione.

In questo modo, la casella about sarebbe simile a:

Informazioni sulla scatola

Il numero applicativo fa parte del commit, ma il "file" informativo "dell'applicazione viene generato durante il processo di impacchettamento, collegando efficacemente un numero di build applicativo a un ID di revisione tecnica .


2
Ho aggiornato il mio script per funzionare con Xcode 3. Puoi prendere una versione aggiornata da gist.github.com/208825 .
Abizern,

34

Puoi semplicemente usare:

git shortlog -s -n

Risultato:

 827  user one
    15  user two
     2  Gest 

22

Un modo semplice è:

 git log --oneline | wc -l

oneline assicura quello.


1
'wc' non è riconosciuto come comando interno o esterno, programma eseguibile o file batch.
user815693,

Bene, quale sistema stai usando? È UNIX? /
Jimmy Kane,

1
Anche questo sembra più veloce se hai migliaia di commit. Tutti gli altri comandi richiedono troppo tempo.
Danny Coulombe,

21

Per inserirlo in una variabile, il modo più semplice è:

export GIT_REV_COUNT=`git rev-list --all --count`

5
In effetti, git rev-listè lo strumento corretto da usare, non git logcome l'altro dice.
Nayuki,

1
Per contare il numero di commit nel lignaggio per raggiungere HEAD: git rev-list --first-parent | wc -l
200_success

Non è necessario wc -lsolo utilizzare l' --countinterruttore: git rev-list --all --count.
slm,

Grazie @slm, ho aggiornato la risposta. Tuttavia, sospetto che la risposta originale sia più vecchia --countdell'interruttore stesso.
John Gietzen,

@JohnGietzen - oh sì, ho pensato che Cool, stavo solo aggiungendo questo dettaglio per aiutare.
slm,

17

Git shortlog è un modo per ottenere i dettagli del commit:

git shortlog -s -n

Ciò fornirà il numero di commit seguito dal nome dell'autore. L'opzione -s rimuove tutti i messaggi di commit per ciascun commit eseguito dall'autore. Rimuovere la stessa opzione se si desidera visualizzare anche i messaggi di commit. L'opzione -n ​​viene utilizzata per ordinare l'intero elenco. Spero che sia di aiuto.


2
git shortlogdi per sé non affronta la domanda originale sul numero totale di commit (non raggruppati per autore). Usa git rev-list HEAD --countinvece.
ctrueden



4

Se stai usando solo un ramo, come master, penso che funzionerebbe alla grande:

git rev-list --full-history --all | wc -l

Questo produrrà solo un numero. Puoi dirlo a qualcosa del genere

git revno

per rendere le cose davvero convenienti. Per fare ciò, modifica il tuo .git/configfile e aggiungilo in:

[alias]
    revno = "!git rev-list --full-history --all | wc -l"

Questo non funzionerà su Windows. Non conosco l'equivalente di "wc" per quel sistema operativo, ma scrivere uno script Python per fare il conteggio per te sarebbe una soluzione multipiattaforma.

EDIT : ottieni il conteggio tra due commit:


Stavo cercando una risposta che mostrasse come ottenere il numero di commit tra due revisioni arbitrarie e non ne vedevo nessuna.

git rev-list --count [older-commit]..[newer-commit]

3

Generare un numero durante la compilazione e scriverlo in un file. Ogni volta che si rilascia una versione, eseguire il commit di quel file con il commento "Build 147" (o qualunque sia il numero di build attualmente). Non eseguire il commit del file durante il normale sviluppo. In questo modo, puoi facilmente mappare tra numeri di build e versioni in Git.


Se due sviluppatori distribuiti lo facessero, i loro numeri di build non si scontrerebbero / si intersecerebbero periodicamente? E se entrambi avessero fatto una build tra gli stessi regimi di un repository condiviso, o forse si sarebbe verificata una collisione solo se uno dei due non avesse apportato modifiche al repository condiviso. Non sono sicuro.
Piani cottura

Certo, ma il conflitto ti dice cosa fare: parla con l'altro ragazzo o usa sempre un numero più alto. Ricorda: un numero non può curare magicamente un processo di generazione interrotto. È solo un promemoria o un suggerimento che devi controllare qualcosa.
Aaron Digulla,

1
Ah, sì, il file magico buildno.txt viene eseguito con il resto. Buon approccio per una piccola squadra o una grande squadra che evita build parallele. L'unico posto in cui riesco a pensare che potrebbe non funzionare altrettanto è per una grande squadra che usa un linguaggio di script (python) che non ha bisogno di un processo di compilazione (per assegnare una sola persona a fare la costruzione).
Piani cottura

3

Nella nostra azienda, siamo passati da SVN a Git. La mancanza di numeri di revisione era un grosso problema!

Fare git svn clone, quindi contrassegnare l'ultimo commit SVN in base al numero di revisione SVN:

export hr=`git svn find-rev HEAD`
git tag "$hr" -f HEAD

Quindi è possibile ottenere il numero di revisione con l'aiuto di

git describe --tags --long

Questo comando dà qualcosa come:

7603-3-g7f4610d

Mezzi: l'ultimo tag è 7603 - è la revisione SVN. 3 - è il conteggio dei commit da esso. Dobbiamo aggiungerli.

Quindi, il numero di revisione può essere contato da questo script:

expr $(git describe --tags --long | cut -d '-' -f 1) + $(git describe --tags --long | cut -d '-' -f 2)

1

Quello che usavo era:

git log | grep "^commit" | wc -l

Semplice ma ha funzionato.


4
ci vuole una riga di messaggio di commit che inizia con "commit" per interrompere il conteggio. Ad esempio: "errori corretti e test non funzionanti che ho inserito accidentalmente in ultimo \ ncommit"
Paweł Polewicz,

1

Utilizzando la sintassi di Bash,

$(git rev-list --count HEAD)

sembra perfetto per una storia puramente lineare. Se a volte vuoi anche avere "numeri" dalle filiali (basato su master), considera:

$(git rev-list --count $(git merge-base master HEAD)).$(git rev-list --count ^master HEAD)

Quando eseguito da un checkout di master, ottieni semplicemente 1234.0o simili. Quando corri da una cassa di un ramo otterrai qualcosa del genere 1234.13, se ci sono stati 13 commit fatti su quel ramo. Ovviamente questo è utile solo nella misura in cui stai basando al massimo un ramo su una data masterrevisione.

--first-parent potrebbe essere aggiunto al micro numero per sopprimere alcuni commit derivanti solo dalla fusione di altre filiali, anche se probabilmente non è necessario.


1

Puoi provare

git log --oneline | wc -l

o per elencare tutti i commit fatti dalle persone che contribuiscono nel repository

git shortlog -s

1

git config --global alias.count 'rev-list --all --count'

Se lo aggiungi alla tua configurazione, puoi semplicemente fare riferimento al comando;

git count


0

Usa git shortlog proprio in questo modo

git shortlog -sn

Oppure crea un alias (per terminale basato su ZSH)

# show contributors by commits alias gcall="git shortlog -sn"


0

Che ne dici di fare un alias?

alias gc="git rev-list --all --count"      #Or whatever name you wish
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.