¿Cómo obtengo el recuento de confirmación de Git?


753

Me gustaría obtener el número de confirmaciones de mi repositorio Git, un poco como los números de revisión SVN.

El objetivo es usarlo como un número de compilación incremental único.

Actualmente me gusta eso, en Unix / Cygwin / msysGit:

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

Pero siento que es un poco hack.

¿Hay una mejor manera de hacer eso? Sería genial si realmente no necesitara wco incluso Git, por lo que podría funcionar en un Windows desnudo. Simplemente lea un archivo o una estructura de directorio ...



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

14
@jberger: Creo que tu comentario debería convertirse en una respuesta.
utapyngo

@utapyngo: dadas las otras 13 respuestas, sabía que estaría enterrado. Lo publiqué aquí entonces.
Jake Berger

@jberger, esta respuesta no funciona para git1.7.0.
Vorac

Respuestas:


1160

Para obtener una cuenta de confirmación para una revisión ( HEAD, master, una confirmación hash):

git rev-list --count <revision>

Para obtener el recuento de confirmación en todas las ramas:

git rev-list --all --count

Recomiendo no usar esto para el identificador de compilación, pero si debe hacerlo, probablemente sea mejor usar el recuento para la rama con la que está compilando. De esa manera, la misma revisión siempre tendrá el mismo número. Si usa el conteo para todas las ramas, la actividad en otras ramas podría cambiar el número.


27
git shortlog | grep -E '^[ ]+\w+' | wc -lsi desea obtener el número total y git shortlog | grep -E '^[^ ]'si desea obtener el número de confirmaciones para cada contribuyente.
skalee

2
Gracias por señalarlo wc -l. Minimalismo FTW. Lo incorporé a mi respuesta.
Benjamin Atkin

17
Esta solución es a la vez hacky (similar al git log --pretty=format:'' | wc -lenfoque dado en la pregunta original) e incorrecta: puede ver esto invirtiendo la coincidencia ( git shortlog | grep -Ev '^[ ]+\w+') y viendo que, por ejemplo, los commits sin mensaje (es decir, "<ninguno>") no se cuentan. El uso git rev-list HEAD --countes más sucinto y más preciso.
ctrueden

17
@BenAtkin: Mis disculpas; No era mi intención ser ofensiva, sino objetiva. Punto tomado sobre la fecha de la respuesta. En ese momento, su solución puede muy bien haber sido la mejor disponible. Pero mantengo mi afirmación de que ahora git rev-list HEAD --countes una mejor solución.
ctrueden

3
También agregó una respuesta y funciona también con versiones anteriores:git log --oneline | wc -l
Jimmy Kane

155

git shortlog es unidireccional


55
Ty Esto funcionó para mí al contar commits en un rango; git shortlog sha1..sha2
RJFalconer

1
Sí, la primera línea de git shortlog tiene el número de confirmaciones. Problema resuelto.
Robert Massaioli

55
El número de confirmaciones se agrupa por confirmador, no tan bueno. Puede contar líneas en el shortlog de git, pero esto no funciona sobre ssh sin un terminal por alguna razón (¿localizador?). ¡La solución original del autor de la pregunta es la mejor! git log --pretty = format: '' | wc -l
Sam Watkins

44
Sin embargo, sugeriría git rev-list HEAD --countmás que el enfoque original dado en el PO. En mis pruebas, git log --pretty=format:'' | wc -lestá apagado por uno.
ctrueden

3
@ctrueden git log --oneline | wc -lno está desactivado por uno (OS X 10.8.5).
Andy Stewart

111

git rev-list HEAD --count

git rev-list

git rev-list <commit>: Enumere las confirmaciones a las que se puede acceder siguiendo los enlaces primarios de la confirmación dada (en este caso, HEAD ).

--count : Imprima un número que indique cuántas confirmaciones se habrían enumerado y suprima todos los demás resultados.


101

Este comando devuelve el recuento de confirmaciones agrupadas por confirmadores:

git shortlog -s

Salida:

14 John lennon
9  Janis Joplin

Es posible que desee saber que el -sargumento es la forma de contracción de --summary.


11
git shortlogpor sí solo no aborda la pregunta original del número total de confirmaciones (no agrupadas por autor). Usar en su git rev-list HEAD --countlugar.
ctrueden

55
¡Increíble! Puede ordenar por | sort -ndemasiado
Mohsen

54

Si está buscando un identificador único y aún bastante legible para las confirmaciones, git describe podría ser lo que necesita.


2
Eso podría funcionar y sería más fácil de usar que un algo hecho a medida. +1
VonC

2
No sabía git describe. Este pequeño número entre el nombre de la etiqueta y el sha1 es justo lo que estaba buscando. Gracias.
Splo

2
Eche un vistazo al script GIT-VERSION-GEN y cómo se usa en el repositorio git, y un script similar en las fuentes del kernel de Linux (y cómo se usan en Makefile).
Jakub Narębski el

Esto proporciona una identificación única, pero no INCREMENTAL. No funciona para mi Sin embargo, la respuesta de Ben Atkin ofrece un recuento de compromiso, que en la práctica debería ser incremental. La respuesta de Aaron Digulla es más segura, pero también requiere más trabajo.
JOM

2
Sí, eso se debe a que el concepto de una identificación incremental no tiene ningún sentido con los sistemas de control de versiones distribuidas.
Bombe

34

No eres el primero en pensar en un "número de revisión" en Git , pero ' wc' es bastante peligroso, ya que commit puede ser borrado o aplastado, y la historia revisitada.

El "número de revisión" fue especialmente importante para Subversion ya que era necesario en caso de fusión (SVN1.5 y 1.6 han mejorado en ese frente).

Podría terminar con un enlace previo a la confirmación que incluiría un número de revisión en el comentario, con un algoritmo que no implique buscar todo el historial de una rama para determinar el número correcto.

Al bazar se le ocurrió tal algoritmo , y puede ser un buen punto de partida para lo que desea hacer.

(Como señala la respuesta de Bombe , Git tiene un algoritmo propio, basado en la última etiqueta, más el número de confirmaciones, más un poco de una clave SHA-1). Debería ver (y votar) su respuesta si funciona para usted.


Para ilustrar la idea de Aaron , también puede agregar el hash Git commit al archivo de "información" de una aplicación que está distribuyendo con su aplicación.

De esa manera, el cuadro sobre se vería así:

Sobre caja

El número de solicitud es parte de la confirmación, pero el 'archivo de "información" de la aplicación se genera durante el proceso de empaquetado, vinculando efectivamente un número de compilación de solicitud con una identificación de revisión técnica .


2
He actualizado mi script para que funcione con Xcode 3. Puede obtener una versión actualizada de gist.github.com/208825 .
Abizern

34

U solo puede usar:

git shortlog -s -n

Resultado:

 827  user one
    15  user two
     2  Gest 

22

Una forma simple es:

 git log --oneline | wc -l

oneline asegura que.


1
'wc' no se reconoce como un comando interno o externo, programa operativo o archivo por lotes.
user815693

Bueno, ¿qué sistema estás usando? ¿Es UNIX? /
Jimmy Kane

1
Esto también parece más rápido si tienes miles de confirmaciones. Todos los otros comandos toman demasiado tiempo.
Danny Coulombe

21

Para ponerlo en una variable, la forma más fácil es:

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

55
De hecho, git rev-listes la herramienta correcta para usar, no git logcomo dice el otro.
Nayuki el

1
Para contar el número de confirmaciones en el linaje para llegar a HEAD: git rev-list --first-parent | wc -l
200_success

No es necesario wc -lsólo tiene que utilizar el --countinterruptor: git rev-list --all --count.
slm

Gracias @slm, he actualizado la respuesta. Aunque, sospecho que la respuesta original es más antigua que el --countinterruptor en sí.
John Gietzen

@JohnGietzen - oh sí, pensé que 8-), solo estaba agregando este detalle para ayudar.
slm

17

El shortlog de Git es una forma de obtener los detalles de confirmación:

git shortlog -s -n

Esto le dará el número de confirmaciones seguidas del nombre del autor. La opción -s elimina todos los mensajes de confirmación para cada confirmación que realizó el autor. Elimine la misma opción si desea ver también los mensajes de confirmación. La opción -n se usa para ordenar la lista completa. Espero que esto ayude.


2
git shortlogpor sí solo no aborda la pregunta original del número total de confirmaciones (no agrupadas por autor). Usar en su git rev-list HEAD --countlugar.
ctrueden



4

Si solo está usando una rama, como master, creo que esto funcionaría muy bien:

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

Esto solo generará un número. Puedes alias a algo como

git revno

para hacer las cosas realmente convenientes. Para hacerlo, edite su .git/configarchivo y agregue esto en:

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

Esto no funcionará en Windows. No sé el equivalente de "wc" para ese sistema operativo, pero escribir una secuencia de comandos de Python para contarlo sería una solución multiplataforma.

EDITAR : Obtenga el recuento entre dos confirmaciones:


Estaba buscando una respuesta que mostrara cómo obtener el número de confirmaciones entre dos revisiones arbitrarias y no vi ninguna.

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

3

Genere un número durante la compilación y escríbalo en un archivo. Cada vez que realice un lanzamiento, confirme ese archivo con el comentario "Build 147" (o el número de compilación que sea actualmente). No confirme el archivo durante el desarrollo normal. De esta manera, puede asignar fácilmente entre números de compilación y versiones en Git.


Si dos desarrolladores distribuidos hicieran esto, ¿no colisionarían / ​​se cruzarían periódicamente sus números de compilación? ¿Qué pasaría si ambos hicieron una construcción entre las mismas revoluciones de un repositorio compartido, o tal vez la colisión solo ocurriría si alguno de los cambios no se hubiera comprometido con el repositorio compartido? No estoy seguro.
hobs

Claro, pero el conflicto te dice qué hacer: solo habla con el otro chico o siempre usa un número más alto. Recuerde: un número no puede curar mágicamente un proceso de construcción roto. Es solo un recordatorio o una pista de que necesita verificar algo.
Aaron Digulla

1
Ahh, sí, el archivo mágico buildno.txt se confirma junto con el resto. Buen enfoque para un equipo pequeño o un equipo grande que evita construcciones paralelas. El único lugar en el que puedo pensar que podría no funcionar tan bien es para un equipo grande que usa un lenguaje de script (python) que no necesita un proceso de compilación (para asignar a una sola persona para construir).
Placas

3

En nuestra empresa, nos mudamos de SVN a Git. La falta de números de revisión fue un gran problema!

Haga git svn clone, y luego etiquete la última confirmación SVN por su número de revisión SVN:

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

Entonces puede obtener el número de revisión con ayuda de

git describe --tags --long

Este comando da algo como:

7603-3-g7f4610d

Medios: la última etiqueta es 7603, es la revisión SVN. 3 - es el recuento de confirmaciones de él. Necesitamos agregarlos.

Entonces, el número de revisión puede ser contado por este script:

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

1

El que solía usar era:

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

Simple pero funcionó.


44
se necesita una línea de mensaje de confirmación que comience con "confirmación" para romper el conteo. Por ejemplo: "errores corregidos y pruebas rotas que accidentalmente introduje en el último \ ncompromiso"
Paweł Polewicz

1

Usando la sintaxis de Bash,

$(git rev-list --count HEAD)

se ve bien para la historia puramente lineal. Si también desea tener a veces "números" de sucursales (basados ​​en master), considere:

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

Cuando se ejecuta desde un proceso de pago master, obtienes simplemente 1234.0o similar. Cuando se ejecuta desde el pago de una rama, obtendrá algo como 1234.13, si se han realizado 13 confirmaciones en esa rama. Obviamente, esto es útil solo en la medida en que esté basando como máximo una rama en una masterrevisión dada .

--first-parent podría agregarse al número micro para suprimir algunas confirmaciones que surgen solo de la fusión de otras ramas, aunque probablemente sea innecesario.


1

Puedes probar

git log --oneline | wc -l

o para enumerar todos los compromisos realizados por las personas que contribuyen en el repositorio

git shortlog -s

1

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

Si agrega esto a su configuración, puede hacer referencia al comando;

git count


0

Use git shortlog como este

git shortlog -sn

O cree un alias (para terminal basado en ZSH)

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


0

¿Qué tal hacer un alias?

alias gc="git rev-list --all --count"      #Or whatever name you wish
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.