Git changelog: как получить все изменения до определенного тега?

есть ли простой способ или команда, чтобы получить все git commits до определенного тега для создания автоматического журнала изменений для проекта? Я всегда помечаю свои репозитории git номером версии, например v0.1.0 и, например, хотел бы, чтобы все коммиты до тега v0.1.0.

Я просмотрел документы, но, похоже, не нашел для него полезной опции или команды:http://git-scm.com/docs/git-log (в данный момент, кстати, не работает)

для пример:

$ git log --oneline --decorate

показывает теги рядом с commits. Я хотел бы то же самое, но только до определенного тега.

7 ответов


вы можете просто сделать:

git log --oneline --decorate v0.1.0

... чтобы показать каждую фиксацию до и включая v0.1.0. Конечно,git log позволяет также позволяет ограничить коммиты, показанные любым из способов, которые git rev-list понимает, так что если вы только хотели увидеть изменения между v0.0.9 и v0.1.0 вы также можете сделать:

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

альтернативным выходом, который может быть полезен для этой цели, является git shortlog, которые группируют и суммируют вклад каждого автора. Попробуй, ибо пример:

git shortlog v0.1.0

для создания изменений по тегам, я использовал этот скрипт:

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

обновление скрипта, предложенного Creotiv, чтобы получить лучшую сортировку тегов

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

есть очень полезный драгоценный камень, вывод написан в markdown, добавьте поддержку проблемы и разделите коммиты по тегам

https://github.com/kebab-project/katip


просто добавить tagname к вашей команде, и вы должны быть в порядке:) мне нравится --graph переключитесь, чтобы визуализировать ветви, которые привели к этому тегу:)


просто используйте имя тега в качестве спецификатора фиксации:git log --oneline --decorate v0.1.0


Я придумал эту модификацию исходного сценария. Это правильно обрабатывает теги версий.

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