2011-09-12 8 views
19

¿Existe una forma o comando sencillo de obtener todos los commit de git hasta una etiqueta específica para generar un registro de cambios automático para un proyecto? Siempre etiqueto mis repositorios git con un número de versión como v0.1.0 y, por ejemplo, me gustaría que todos los commits hasta la etiqueta v0.1.0.Git changelog: cómo obtener todos los cambios hasta una etiqueta específica?

He mirado a través de los documentos, pero no parecen encontrar una opción útil o un comando para ello: http://git-scm.com/docs/git-log (es abajo en el momento por cierto)

Por ejemplo:

$ git log --oneline --decorate 

Muestra las etiquetas junto a confirmaciones. Me gustaría lo mismo, pero solo hasta una etiqueta específica.

+1

Pertinente a tus intereses: Pimp My Changelog, un script de Ruby para hacer esto. https://github.com/pcreux/pimpmychangelog – olleolleolle

Respuesta

34

Sólo puede hacer:

git log --oneline --decorate v0.1.0 

... para mostrar cada confirmación hasta e incluyendo v0.1.0. Por supuesto, git log permite también le permite restringir las confirmaciones que se muestran en cualquiera de las formas que git rev-list entiende, así que si sólo quería ver los cambios entre v0.0.9 y v0.1.0 También puede hacer:

git log --oneline --decorate v0.0.9..v0.1.0 

salida alternativa que podría ser útil para este propósito es el de git shortlog, que agrupa y resume las contribuciones de cada autor. Pruebe, por ejemplo:

git shortlog v0.1.0 
+0

Gracias por su elaborada respuesta :) Esto es exactamente lo que quería. – Luwe

+2

Para mostrar las confirmaciones después de una etiqueta específica, puede usar 'git log --oneline --decorate v0.1.0..' –

+0

¿Cómo copiar el registro después de ejecutar el comando git, es decir, git log --oneline --decorate? –

1

Sólo anexar tagname a su mando y que debe estar bien :) me gusta el interruptor --graph para visualizar las ramas que condujeron a esa etiqueta :)

1

sólo tiene que utilizar el nombre de la etiqueta como un especificador de comprometerse: git log --oneline --decorate v0.1.0

5

Para la creación de cambios por las etiquetas, he utilizado este script:

#!/bin/bash 
# Author:Andrey Nikishaev 
echo "CHANGELOG" 
echo ---------------------- 
git tag -l | sort -u -r | while read TAG ; do 
    echo 
    if [ $NEXT ];then 
     echo [$NEXT] 
    else 
     echo "[Current]" 
    fi 
    GIT_PAGER=cat git log --no-merges --format=" * %s" $TAG..$NEXT 
    NEXT=$TAG 
done 
FIRST=$(git tag -l | head -1) 
echo 
echo [$FIRST] 
GIT_PAGER=cat git log --no-merges --format=" * %s" $FIRST 
+0

Si sus etiquetas son versiones en el formulario xyz, agregue el indicador' -V' a 'sort' para ordenar correctamente versiones como 1.0 .9, 1.0.10, etc. –

2

una actualización del guión sugerido por Creotiv para obtener una mejor clasificación de las etiquetas

#!/bin/bash 
# Author:Andrey Nikishaev, Gunnar Lindholm 
echo "CHANGELOG" 
echo ---------------------- 
git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags |tac |grep -v '^$' | while read TAG ; do 
    echo 
    if [ $NEXT ];then 
     echo [$NEXT] 
    else 
     echo "[Current]" 
    fi 
    GIT_PAGER=cat git log --no-merges --format=" * %s" $TAG..$NEXT 
    NEXT=$TAG 
done 
FIRST=$(git tag -l | head -1) 
echo 
echo [$FIRST] 
GIT_PAGER=cat git log --no-merges --format=" * %s" $FIRST 
0

me ocurrió con esta modificación de la escritura original. Esto maneja las etiquetas de versión correctamente.

#!/bin/bash 
# Author:Andrey Nikishaev 
echo "CHANGELOG" 
echo ---------------------- 
git tag -l --sort=v:refname | tac | while read TAG ; do 
    echo 
    if [ $NEXT ];then 
     echo [$NEXT] 
    else 
     echo "[Current]" 
    fi 
    GIT_PAGER=cat git log --no-merges --format=" * %s" $TAG..$NEXT 
    NEXT=$TAG 
done 
FIRST=$(git tag -l --sort=v:refname | head -1) 
echo 
echo [$FIRST] 
GIT_PAGER=cat git log --no-merges --format=" * %s" $FIRST 
Cuestiones relacionadas