2012-07-25 12 views
87

Ya encontré esta respuesta: Number of commits on branch in git pero eso supone que la rama se creó desde el maestro.Cuenta el número de confirmaciones en una rama de Git

¿Cómo puedo contar el número de confirmaciones a lo largo de una rama sin confiando en esa suposición?

En SVN esto es trivial, pero por alguna razón es realmente difícil de entender en git.

+1

posible duplicado de [número de confirmaciones en la rama en git] (http://stackoverflow.com/questions/10913892/number-of-commits-on- branch-in-git) – endrigoantonini

Respuesta

169

para contar las confirmaciones de la rama que está en:

git rev-list --count HEAD 

para una rama

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

Si desea contar las confirmaciones en una rama que se hacen desde que creó la rama

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

Esto contará todos los commits realizados que no estén en el nombre de la rama también.

Ejemplos

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

Resultado: 3

Si su rama trata de una rama llamada develop:

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

Resultado: 3

Ignorando Merges

Si fusiona otra sucursal en la sucursal actual sin avanzar y hace lo anterior, también se cuenta la fusión. Esto se debe a que para git una fusión es una confirmación.

Si no desea contar estas confirmaciones se suman --no-merges:

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

ninguno de estos muestra el número correcto, por ejemplo, maestro y nombre de rama muestran el mismo número de confirmaciones. – botbot

+0

Los comentarios no permiten realmente el código, pero esto debería mostrar que funciona. ==== $ 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 add. ==== $ git commit -a ==== $ git rev-list --count master => 1 ==== $ git rev-list --count test => 2 ==== $ git rev-list --count HEAD^master => 1 ==== –

+0

Estoy de acuerdo con @botbot. Estos no son realmente precisos. Por ejemplo, intente agregar algunos commit de fusión o pull/rebase y observe que los conteos como se muestra arriba empiezan a ser poco confiables. –

2

¿Qué tal git log --pretty=oneline | wc -l

Eso debería contar todas las confirmaciones desde la perspectiva de su rama actual.

+0

¿Qué columna cuenta? ¿Es el primero? – Hengjie

1

Una forma de hacerlo es enumerar el registro de su sucursal y contar las líneas.

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

esta línea

git shortlog -s -n 

generará una salida como ésta

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

¿Cuáles son estos números antes de los nombres? puedes explicar ? –

+3

@Ciastopiekarz estos son los compromisos de cada persona. –

23

Se puede requerir un tiempo relativamente versión reciente de Git, pero esto funciona bien para mí:

git rev-list --count develop..HEAD 

Esto me da un recuento exacto de las confirmaciones en la rama actual que tiene su base en el maestro.

El comando en la respuesta de Peter, git rev-list --count HEAD ^develop incluye muchas más confirmaciones, 678 vs 97 en mi proyecto actual.

Mi historial de confirmaciones es lineal en esta rama, por lo que YMMV, pero me da la respuesta exacta que quería, que es "¿Cuántas confirmaciones he agregado hasta ahora en esta rama de características?".

+2

Esta es la respuesta correcta. – Dvole

0

También puede hacer git log | grep commit | wc -l

y obtener el resultado de nuevo

+1

Esto no es confiable. Emparejaría commits que tienen "commit" en el mensaje de confirmación dos veces, por ejemplo. – rdb

+0

@rdb No, no lo hará.Solo generará * cantidad de líneas * que contengan la palabra "confirmar", por lo que una línea nunca se contará dos veces. – iBug

+0

@iBug: Te estás perdiendo el punto. Si el mensaje de confirmación contiene la palabra "confirmar", aparece en una línea separada de la línea "confirmar a1b2c ..." en el resultado 'git log', por lo que la confirmación se contará dos veces en el resultado. Incluso peor si el mensaje de compromiso fuera a contener la palabra "commit" dos veces en dos líneas separadas. – rdb

1

me gusta hacer git shortlog -s -n --all. Te da una lista de nombres de "tabla de clasificación" y el número de confirmaciones.

0

Bueno, la respuesta seleccionada no funciona si ha bifurcado su rama de una rama no específica (es decir, no master o develop).

Aquí ofrezco una manera diferente que estoy usando en mis ganchos git pre-push.

# 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 

Para más análisis, por favor visite my blog

Cuestiones relacionadas