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

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

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

Например:

$ git log --oneline --decorate

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

Ответ 1

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

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

Ответ 2

Для создания журнала изменений по тегам я использовал этот 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

Ответ 3

Обновление для script, предложенное 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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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