2010-06-04 14 views
19

Cómo generar cambios de confirmaciones agrupadas por fecha, en formato:git: día a día de cambios

[date today] 
- commit message1 
- commit message2 
- commit message3 
... 
[date day+3] 
- commit message1 
- commit message2 
- commit message3 
... 
(skip this day if no commits) 

[date day+1] 
- commit message1 
- commit message2 
- commit message3 
... 
[date since] 
- commit message1 
- commit message2 
- commit message3 

Cualquier comando git log, o escritura del golpe inteligente?

+1

¿Qué pasa si commitdate es no monótona, debido al desplazamiento de reloj/reloj mal configurado para uno de los contribuyentes? –

Respuesta

22

Aquí es sucia, pero la versión de trabajo del guión que se le ocurrió:

#!/bin/bash 
# Generates changelog day by day 
NEXT=$(date +%F) 
echo "CHANGELOG" 
echo ---------------------- 
git log --no-merges --format="%cd" --date=short | sort -u -r | while read DATE ; do 
    echo 
    echo [$DATE] 
    GIT_PAGER=cat git log --no-merges --format=" * %s" --since=$DATE --until=$NEXT 
    NEXT=$DATE 
done 
+1

Simplemente use una tubería en el ciclo: 'producir y ordenar fechas | mientras lee DATE; hacer ... hecho'.Por cierto, es posible que desee 'GIT_PAGER = cat git log ...' para el segundo (para evitar que * git log * use un pager cuando el resultado de todo el script va a un terminal). Además, es probable que desee ser coherente con '--no-merges', de lo contrario, podría obtener los encabezados' [date] 'sin ninguna confirmación si todas las confirmaciones de un día fueran fusiones. –

+0

Gracias Chris. He actualizado el código. (Previamente estaba intentando agregar la tubería al final del ciclo) – takeshin

+0

Lo excavo. Gracias. –

1

git log tiene --since y --until, no debería ser difícil envolver algunas cosas.

1

Eso requeriría sin duda algún tipo de secuencia de comandos.
Un poco como esta commandline-fu

for k in `git branch|perl -pe s/^..//`;do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k|head -n 1`\\t$k;done|sort -r 

(no exactamente lo que está después, pero puede le da una idea no obstante)

que sé de GitStats que tiene también datos organizados por fecha (pero no el los mensajes de confirmación)


Nota: la parte git branch de este comando está enfermo equipado-secuencias de comandos, como Jakub Narębski comentarios.
git for-each-ref o git show-ref son candidatos naturales para comandos de scripting, siendo plomería comandos.

+0

Gracias por esta respuesta informativa. Una cosa más que necesito saber: cómo enumerar todas las confirmaciones para el día único específico: 'git log --since =" 2010-06-02 "--until =" 2010-06-02 '' no enumerar nada . – takeshin

+0

@takeshin: ¿has probado 'git log --since =" 2010-06-02 "--until =" 2010-06-03 ''? (de un día - 02 - a otro - 03 -) – VonC

+0

@VonC, sí, pero en el simple bucle solo sé la fecha, no la fecha siguiente. – takeshin

8

no pude conseguir la respuesta aceptada para manejar confirmaciones de hoy como mi configuración no manejar la variable correctamente en SIGUIENTE la primera iteración. parámetros de registro de Git aceptarán un tiempo demasiado, lo que elimina la necesidad de una fecha SIGUIENTE:

#!/bin/bash 
# Generates changelog day by day 
echo "CHANGELOG" 
echo ---------------------- 
git log --no-merges --format="%cd" --date=short | sort -u -r | while read DATE ; do 
    echo 
    echo [$DATE] 
    GIT_PAGER=cat git log --no-merges --format=" * %s" --since="$DATE 00:00:00" --until="$DATE 24:00:00" 
done 
+0

Esto es realmente bueno. Lo único es que echo [$ DATE] no funciona porque intenta evaluar una expresión o lo que sea. Así que solo quita los soportes y está bien – Yanis