2010-06-04 4 views
19

Как создать список изменений фиксаций сгруппированной по дате, в формате:мерзавец: изменений изо дня в день

[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 

Любая команда журнала GIT, или смарт-Баш скрипт?

+1

Что делать, если commitdate не является монотонной, из-за перекоса часов/часы для неправильной конфигурации одного из участников? –

ответ

22

Вот грязный, но рабочий вариант сценария я придумал:

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

Просто используйте трубу в цикле: 'product-and-sort-dates | при чтении DATE; делать …; done'.Кстати, вам может понадобиться «GIT_PAGER = cat git log ...» для второго (чтобы предотвратить * git log * от использования пейджера, когда вывод всего скрипта идет на терминал). Кроме того, вы, вероятно, хотите быть совместимыми с '--no-merges', иначе вы можете получить' [date] 'заголовки без каких-либо коммитов, если все коммиты в течение дня сливаются. –

+0

Спасибо, Крис. Я обновил код. (Раньше я пытался добавить трубку в конце цикла) – takeshin

+0

Я копаю. Благодарю. –

1

git log имеет --since и --until, это не должно быть трудно обернуть кое-что вокруг этого.

1

Для этого потребуется, скорее всего, какой-то сценарий.
Немного как это 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 

(не точно, что вы после, но может дает вам представление, тем не менее)

я знаю о GitStats, который имеет также данные, организованные по дате (но не сообщения фиксации)


Примечания: git branch части этой команды плохо приспособлена для написания сценариев, а Jakub Narębski комментарии.
git for-each-ref или git show-ref являются естественными кандидатами на команды сценариев, являющиеся сантехника команд.

+0

Спасибо за этот информативный ответ. Еще одна вещь, которую мне нужно знать: как перечислить все коммиты для конкретного, одного дня: 'git log --since =" 2010-06-02 "--until =" 2010-06-02 "list ничего , – takeshin

+0

@takeshin: вы попробовали 'git log --since =" 2010-06-02 "--until =" 2010-06-03 "'? (с одного дня - 02 - до другого - 03 -) – VonC

+0

@ VonC, да, но в простой петле я знаю только дату, а не следующую дату. – takeshin

8

Я не мог получить ответ на принятый обрабатывать сегодняшние фиксации, как моя установка не обрабатывать следующие переменную должным образом на первая итерация. Параметры журнала Git будут принимать время тоже, что устраняет необходимость в следующую дату:

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

Это действительно приятно. Единственное, что echo [$ DATE] не работает, потому что он пытается оценить выражение или что-то еще. Так что просто удалите скобки, и все в порядке. – Yanis

0

Я написал сценарий в Python для создания недели за неделю журнала GIT.

Вы можете легко изменить его на дни, месяцы и т.д., изменяя timedelta

https://gist.github.com/NahimNasser/4772132