Conta il numero di commit su un ramo Git


Risposte:


350

Per contare i commit per la filiale in cui ti trovi:

git rev-list --count HEAD

per un ramo

git rev-list --count <branch-name>

Se si desidera contare i commit su un ramo effettuati da quando è stato creato il ramo

git rev-list --count HEAD ^<branch-name>

Questo conterà tutti i commit mai fatti che non sono anche sul nome del ramo.

Esempi

git checkout master
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^master

Risultato: 3

Se il tuo ramo proviene da un ramo chiamato develop:

git checkout develop
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^develop

Risultato: 3

Ignorando le fusioni

Se unisci un altro ramo nel ramo corrente senza avanzare rapidamente e fai quanto sopra, viene conteggiata anche l'unione. Questo perché per git una fusione è un commit.

Se non vuoi contare questi commit aggiungi --no-merges:

git rev-list --no-merges --count HEAD ^develop

7
nessuno di questi mostra il numero giusto, ad esempio master e branchname mostrano lo stesso numero di commit.
botbot,

I commenti non consentono davvero il codice, ma questo dovrebbe mostrare che funziona. ==== $ git init ==== $ touch test.txt ==== $ git add. ==== $ git commit -a ==== $ git rev-list --count HEAD => 1 ==== $ git rev-list --count master => 1 ==== $ git checkout -b test ==== $ git rev-list --count test => 1 ==== $ git rev-list --count HEAD ^ master => 0 ==== $ touch test2.txt ==== $ git Inserisci . ==== $ git commit -a ==== $ git rev-list --count master => 1 ==== $ git rev-list --count test => 2 ==== $ git rev-list --count HEAD ^ master => 1 ====
Peter van der Does

1
Sono d'accordo con @botbot. Questi non sono molto precisi. Ad esempio, prova ad aggiungere alcuni commit di unione o pull / rebase e nota che i conteggi come sopra descritti iniziano a diventare inaffidabili.
Wil Moore III,

2
@wilmoore Vuoi dire che ottieni un conteggio extra dopo aver unito una filiale? Questo è tecnicamente un commit e quindi viene conteggiato. ma se non vuoi contare questi commit aggiungi --no-merges. Aggiornerò la risposta.
Peter van der Does

2
rev-list --count flag non esiste in git 1.7. In questo momento, i suggerimenti di downvoted-to-hell qui sotto git logstanno funzionando meglio di qualsiasi altro suggerimento.
aaronbauman,

60

Per vedere il totale no di commit puoi fare come Peter ha suggerito sopra

git rev-list --count HEAD

E se vuoi vedere il numero di commit fatti da ogni persona prova questa riga

git shortlog -s -n

genererà output in questo modo

135  Tom Preston-Werner
15  Jack Danger Canty
10  Chris Van Pelt
7  Mark Reid
6  remi

3
quali sono questi numeri prima dei nomi? Puoi spiegare ?
Ciasto piekarz,

5
@Ciastopiekarz sono il numero di commit per persona.
Asnad Atta,

39

Potrebbe richiedere una versione relativamente recente di Git, ma per me funziona bene:

git rev-list --count develop..HEAD

Questo mi dà un conteggio esatto di commit nell'attuale ramo che ha la sua base sul master.

Il comando nella risposta di Peter git rev-list --count HEAD ^developinclude molti altri commit, 678 vs 97 sul mio progetto attuale.

La mia cronologia di commit è lineare su questo ramo, quindi YMMV, ma mi dà la risposta esatta che volevo, che è "Quanti commit ho aggiunto finora su questo ramo di funzionalità?".


Dovrebbe essere lo stesso. Lo dice la documentazione . A special notation "<commit1>..<commit2>" can be used as a short-hand for "^'<commit1>' <commit2>". For example, either of the following may be used interchangeably: $ git rev-list origin..HEAD $ git rev-list HEAD ^origin
dosentmatter

Sono confuso: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;non è in fila. DIETRO è come il 1800 quando in realtà nulla di più grande di unire upstream / master ~ 400 produce cambiamenti. usare --no-mergesnon è molto meglio, dà come 900. E se faccio un'unione come questa con ~ 800 e il conteggio delle rev-list è 1800, allora faccio un'unione con ~ 790 ottengo tra 6 e 28 un conteggio inferiore in rev -elenco.
dlamblin,

7

Quanti impegni sono stati effettuati nella filiale corrente dall'inizio della storia, senza contare i commit delle filiali unite:

git rev-list HEAD --count --first-parent

Dalla documentazione git rev-list --help :

--first-parent

Segui solo il primo commit genitore dopo aver visto un commit di unione. Questa opzione può fornire una panoramica migliore quando si visualizza l'evoluzione di un determinato ramo di argomento, poiché le fusioni in un ramo di argomento tendono a riguardare solo periodicamente l'aggiornamento a monte aggiornato e questa opzione consente di ignorare i singoli commit portati a la tua storia da tale fusione. Non può essere combinato con --bisect.

Nota: il clone poco profondo riduce la dimensione della cronologia. Ad esempio, se cloni con --depth 1, verrà restituito 1.

numero di commit eseguiti da altri commit:

git rev-list HEAD abc0923f --count --first-parent

o lo stesso:

git rev-list abc0923f.. --count --first-parent

o utilizzare qualsiasi altro riferimento git :

git rev-list master tag-v20 --count --first-parent

Il conteggio viene eseguito dall'anno 2018

git rev-list HEAD --count --first-parent --since=2018-01-01

01-01-2018, 01.01.2018, 2018.01.01 funziona anche.


git rev-label

Ho scritto uno script per ottenere la revisione della versione da Git in un formato simile a quello '$refname-c$count-g$short$_dirty'che si espande master-c137-gabd32ef.
La guida è inclusa nello script stesso.


git rev-list abc0923f .. --count --first-parent sta dando risultati adeguati per il mio ramo ma il primo comando sta dando un grande valore
Jiss Raphel

5

Che ne dite di git log --pretty=oneline | wc -l

Ciò dovrebbe contare tutti i commit dalla prospettiva del tuo ramo attuale.


Quale colonna conti? È il primo?
Hengjie,

3

Mi piace fare git shortlog -s -n --all. Ti dà un elenco di stile "classifica" di nomi e numero di commit.


2

Un modo per farlo è elencare il registro per il tuo ramo e contare le linee.

git log <branch_name> --oneline | wc -l

1

Bene, la risposta selezionata non funziona se hai deviato il tuo ramo da un ramo non specifico (cioè, no mastero develop).

Qui offro un altro modo che sto usando nei miei pre-pushgit git.

# Run production build before push
echo "[INFO] run .git/hooks/pre-push"

echo "[INFO] Check if only one commit"

# file .git/hooks/pre-push
currentBranch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

gitLog=$(git log --graph --abbrev-commit --decorate  --first-parent HEAD)

commitCountOfCurrentBranch=0
startCountCommit=""
baseBranch=""

while read -r line; do

    # if git log line started with something like "* commit aaface7 (origin/BRANCH_NAME)" or "commit ae4f131 (HEAD -> BRANCH_NAME)"
    # that means it's on our branch BRANCH_NAME

    matchedCommitSubstring="$( [[ $line =~ \*[[:space:]]commit[[:space:]].*\((.*)\) ]] && echo ${BASH_REMATCH[1]} )"

    if [[ ! -z ${matchedCommitSubstring} ]];then

      if [[  $line =~ $currentBranch ]];then
        startCountCommit="true"
      else
        startCountCommit=""

        if [[ -z ${baseBranch} ]];then
          baseBranch=$( [[ ${matchedCommitSubstring} =~ (.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${matchedCommitSubstring} )

        fi

      fi

    fi


    if [[ ! -z ${startCountCommit} && $line =~ ^\*[[:space:]]commit[[:space:]] ]];then
      ((commitCountOfCurrentBranch++))
    fi


done <<< "$gitLog"

if [[ -z ${baseBranch} ]];then

  baseBranch="origin/master"

else

  baseBranch=$( [[ ${baseBranch} =~ ^(.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${baseBranch} )

fi


echo "[INFO] Current commit count of the branch ${currentBranch}:  ${commitCountOfCurrentBranch}"

if [[ ${commitCountOfCurrentBranch} -gt 1 ]];then
  echo "[ERROR] Only a commit per branch is allowed. Try run 'git rebase -i ${baseBranch}'"
  exit 1
fi

Per ulteriori analisi, visita il mio blog


1

Come riferimento OP Numero di commit su branch in git Voglio aggiungere che le risposte fornite lì funzionano anche con qualsiasi altro branch, almeno dalla versione 2.17.1 di git (e apparentemente più affidabile della risposta di Peter van der Does):

funziona correttamente:

git checkout current-development-branch
git rev-list --no-merges --count master..
62
git checkout -b testbranch_2
git rev-list --no-merges --count current-development-branch..
0

L'ultimo comando dà zero commit come previsto da quando ho appena creato il ramo. Il comando precedente mi dà il numero reale di commit sul mio ramo di sviluppo meno i merge-commit

non funziona correttamente:

git checkout current-development-branch
git rev-list --no-merges --count HEAD
361
git checkout -b testbranch_1
git rev-list --no-merges --count HEAD
361

In entrambi i casi ottengo il numero di tutti i commit nel ramo di sviluppo e il master da cui discendono (indirettamente) i rami.


1

Se si utilizza un sistema UNIX, è possibile farlo

git log|grep "Author"|wc -l

-2

Puoi anche fare git log | commit di grep | wc -l

e ottenere il risultato


1
Questo non è affidabile. Ad esempio, corrisponderebbe ai commit che hanno "commit" nel messaggio di commit due volte.
rdb,

@rdb No, non lo farà. Produrrà solo il numero di righe contenenti la parola "commit", quindi una riga non verrà mai conteggiata due volte.
iBug

@iBug: ti manca il punto. Se il messaggio di commit contiene la parola "commit", appare su una riga separata dalla riga "commit a1b2c ..." git lognell'output, in modo che il commit verrà conteggiato due volte nel risultato. Ancora peggio se il messaggio di commit dovesse contenere la parola "commit" due volte su due righe separate.
rdb,
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.