Как показать git commit, используя количество коммитов с момента тега - PullRequest
20 голосов
/ 21 декабря 2011

С помощью git describe вы можете получить количество коммитов с момента последнего тега.Если бы у вас были только тег и количество коммитов, какой лучший способ показать описанный коммит?

Я знаю, вы могли бы использовать git log tag.. и передать его в скрипт, который выполняет подсчет, но янадеялся на более элегантное решение, подобное git show tag~n.

Чтобы добавить больше контекста, мы планируем использовать git describe для создания номеров релизов, например, с

$ git describe
v1.5-39-g5ede964

мы будем использовать foo_1.5.39.Нам хотелось бы знать, что 1.5.39 означает 39-й коммит после тега v1.5, найти этот коммит, т.е. найти g5ede964.Как указано в комментарии, 39-й коммит после v1.5 может быть не уникальным.Так что, возможно, лучший способ спросить это, каков наилучший способ найти все коммиты X так, чтобы, если HEAD указывал на X git describe, возвращалось бы v1.5-39-*****.

Ответы [ 6 ]

26 голосов
/ 11 декабря 2013

Попробуйте

git rev-list tag..HEAD --count

ИЛИ

git rev-list tag.. --count

Они означают одно и то же.

10 голосов
/ 07 апреля 2014

Если вы ищете количество коммитов с момента последнего тега, у меня сработало следующее

git rev-list  `git rev-list --tags --no-walk --max-count=1`..HEAD --count
5 голосов
/ 22 декабря 2011

То, что вы просите, невозможно в общем случае.Число коммитов само по себе ничего не скажет, если в вашей истории есть какие-либо слияния.

Например, с учетом следующей структуры репо:

a - b - c - d - h
  \           /
    e - f - g

С надетым тегом a, выходы git describe d и git describe g идентичны, за исключением SHA1:

> git describe d
tag-3-ge8dca33
> git describe g
tag-3-g4fecc2e

Тем не менее, если у вас не происходит одновременно несколько параллельных ветвей, тогда выможет быть в состоянии разрешить данный номер коммита обратно в один коммит, но если у вас есть хотя бы одна активная боковая ветвь на момент вашего тега, это может не сработать.

Если вам нужны надежные номера выпусков,Вы должны придерживаться явных тегов.

3 голосов
/ 21 декабря 2011

Вы можете:

git log --oneline tag.. | wc -l

это даст вам количество коммитов

0 голосов
/ 12 ноября 2017

Каков наилучший способ найти все коммиты X, если бы HEAD указывал на X git describe, вернуло бы v1.5-39-*****

все еще неправильный вопрос. Правильный вопрос

как найти все коммиты X так, что если бы HEAD указывал на X, обычный git describe мог бы когда-либо вернуть v1.5-39-*****

и на это не так просто ответить. Тем не менее, при отсутствии действий противника эта процедура перечислит правильный коммит, возможно, среди некоторых других возможностей:

ancestor=v1.5 n=39
git rev-list --all --reverse --topo-order --parents --ancestry-path ^$ancestor \
| awk ' function minmore(       i) {
                for ( i=2; i <= NF; ++i )
                        if ( gen[$i] > gen[$1] ) 
                                gen[$1]=gen[$i]
                return ++gen[$1]
        }
        minmore()<=n {
                print "[[ $(git rev-list --count "ancestor".."$1") == "n" ]] &&"
                print "         git describe --match="ancestor" "$1 }
      ' ancestor=$ancestor n=$n \
# | sh    # lose the first `#` here to actually run the generated checks

Причина неопределенности и сложности заключается в том, что git describe просто пытается получить разумную базу, поэтому (см. его документы ) он выберет самый последний из ближайших текущих тегов, которые он может посмотрите и посчитайте, сколько дополнительных коммитов есть в описанной истории, и таким образом сгенерируйте прозвище Например, новые теги могут изменить свою предпочитаемую базу так, что голые git describe больше не будут генерировать это прозвище; и хотя SHA являются неизменными, ссылки могут быть переписаны.

0 голосов
/ 11 ноября 2017

Как объяснил ответ Кевина , это, как правило, невозможно. Для решения проблемы в особых случаях он упомянул:

Тем не менее, если у вас не происходит одновременно несколько параллельных ветвей, вы можете разрешить заданный номер коммита обратно в один коммит, но если у вас есть хотя бы одна активная боковая ветвь в время вашего тега, то это может не сработать.

вы можете использовать следующую команду (с n - количество коммитов с тега)

git rev-list tag..HEAD --reverse | awk NR==n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...