"git description" игнорирует тег

В следующих строках:

$ git tag -n1
v1.8        Tagged the day before yesterday
v1.9        Tagged yesterday
v2.0        Tagged today
$ git describe
v1.9-500-ga6a8c67
$ 

Кто-нибудь может объяснить, почему тег v2.0 не используется "git description", и как это исправить? Тег v2.0 уже выдвинут, поэтому я предполагаю, что не могу просто удалить и повторно добавить его.

3 ответа

Решение

git describe по умолчанию используются только аннотированные теги. указать --tags возможность использовать легкие теги

убедитесь, что вы отметили правильный коммит (git rev-parse HEAD). аннотированные теги создаются с git tag -a, если вы делаете git show <tagname> и вы видите только коммит, это легкий тег, если вы видите дополнительное сообщение тега, это аннотированный тег.

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

# git log --oneline --decorate=short
deba4b4 (tag: v1.1.0.20.0, tag: v1.1.0.19.0) 001 New buildnumber

Здесь есть два тега, один для версии 19 и другой для 20. 20 был помечен после 19, но для того же коммита. В этом случае описание возвращено

# git describe --tags
v1.1.0.19.0

Я не знаю, почему он это сделал, но похоже, что он работает с дублирующимися тегами.

Другой случай, когда это может произойти, если у вас есть тег, который более "близок" к вам в ветке. Этот случай был объяснен в этом сообщении в блоге.

Вопрос git tag показывает все теги во всех филиалах, а git describe использует только теги для коммитов, которые доступны в текущей ветке.

Вот пример (причина, почему я пришел сюда на самом деле):

 $ git tag | tail -n3
v0.4.0
v0.4.1
v0.4.2

Показывает последний доступный тег v0.4.2, но это мой вывод git describe:

 $ git describe --tags
v0.4.0-2-acd334c

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

 $ git log --oneline --decorate=short | grep '\(tag\:' | head -n3
acd334c (tag: v0.4.0) Merge pull request #1061
988fe5e (tag: v0.3.6) Merge pull request #859
5f97274 (tag: v0.3.5) Merge pull request #646

Так что в моем случае разработчики решили создать новую ветку релизов исключительно для маркировки релизов, в результате чего ветка разработки больше не соответствует тегам.

Надеюсь, это поможет, и спасибо @eis за идею проверки журналов.

Скорее всего из вашего примера, v1.9 это тег из фиксации слияния.

По умолчанию ожидается поведение git, и вы можете прочитать об этом здесь: https://git.kernel.org/pub/scm/git/git.git/commit/?id=80dbae03

Чтобы игнорировать теги слияния при поиске самых последних в текущей ветке, вы можете использовать --first-parent вариант.

git describe --tags --first-parent --abbrev=0

- первый родитель

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

Ссылка: https://git-scm.com/docs/git-describe

Другие вопросы по тегам