2010-06-04 7 views
19

Comment générer changelog de commits par date groupped, au format:git: jour changelog par jour

[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 

Toute commande git log, ou d'un script bash intelligent?

+1

si commitdate est horloge non monotones, en raison de l'inclinaison de l'horloge/misconfigured pour l'un des contributeurs? –

Répondre

22

est ici sale, mais la version de travail du script, je suis venu avec:

#!/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

Utilisez simplement un tube dans la boucle: 'produce-and-sort-dates | en lisant DATE; faire …; fait ».Incidemment, vous pourriez vouloir 'GIT_PAGER = chat git log ...' pour le second (pour empêcher * git log * d'utiliser un pager lorsque la sortie de tout le script va à un terminal). De plus, vous voulez probablement être cohérent avec '--no-merges', sinon vous pourriez avoir des en-têtes' [date] 'sans aucun commit si toutes les validations d'un jour étaient fusionnées. –

+0

Merci Chris. J'ai mis à jour le code. (Auparavant j'essayais d'ajouter le tuyau à la fin de la boucle) – takeshin

+0

Je le creuse. Merci. –

1

git log a --since et --until, il ne devrait pas être difficile d'envelopper certaines choses autour de cela.

1

Cela nécessiterait très certainement une sorte de script.
Un peu comme ce 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 

(pas exactement ce que vous recherchez, mais pouvez-vous donne une idée tout de même)

Je sais GitStats qui a également des données organisées par date (mais pas le engager des messages)


note: la git branch partie de cette commande est mal équipé pour les scripts, comme Jakub Narębski commentaires.
git for-each-ref ou git show-ref sont des candidats naturels pour les commandes de script, étant plomberie commandes.

+0

Merci pour cette réponse informative. Une chose de plus que je dois savoir: Comment lister tous les commits pour le seul jour spécifique: 'git log --since =" 2010-06-02 "--until =" 2010-06-02 "' ne liste rien . – takeshin

+0

@takeshin: avez-vous essayé 'git log --since =" 2010-06-02 "--until =" 2010-06-03 "'? (d'un jour - 02 - à un autre - 03 -) – VonC

+0

@VonC, oui, mais dans la boucle simple, je ne connais que la date, pas la date suivante. – takeshin

8

Je ne pouvais pas la réponse acceptée pour gérer les commits d'aujourd'hui que ma configuration ne gère pas la variable suivante correctement sur la première itération. Les paramètres du journal de Git acceptera un temps trop, ce qui élimine la nécessité d'une prochaine date:

#!/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

C'est vraiment sympa. La seule chose est que echo [$ DATE] ne fonctionne pas parce qu'il essaie d'évaluer une expression ou autre chose. Il suffit donc de retirer les supports et c'est bon – Yanis