показать все тэги в git log - PullRequest
84 голосов
/ 18 ноября 2010

Почему git log --decorate не отображает более одного тега за коммит?

РЕДАКТИРОВАТЬ : Чарльз Бейли придумал ответ (по крайней мере, в моемcase)
По сути, у меня был один тег, который указывал на другой тег, который указывал на коммит.Из-за этого дополнительного уровня косвенности тег не показывался в журнале.Я должен исправить это, увядая, исправив наш скрипт тегов для правильной метки, или с помощью некоторого скрипта оболочки voodoo, чтобы рекурсивно следовать тегам.В любом случае, я оставлю этот вопрос только для справки на тот случай, если кто-нибудь захочет.(Я новичок в переполнении стека, но я предполагаю, что это правильный протокол?)

... Следует оригинальный вопрос ...

Предыстория: мы используем GIT на работе для контроля исходного кодаи у нас есть политика всегда помечать коммит при развертывании.(На самом деле это скрипт, который делает теги, а затем извлекает тег на сервере).Поскольку это веб-приложение с отдельными промежуточными и рабочими серверами, мы часто помечаем выпуск для промежуточной (для тестирования или чего-либо еще), а затем помечаем тот же коммит для производства.

Так что на самом деле очень часто мы имеемнесколько тегов на одном коммите.Было бы очень приятно увидеть это в текстовом журнале, но, похоже, это не поддерживается.В настоящее время я работаю над этой проблемой, вручную проверяя нужный тег или запуская gitk.Хотя оба эти решения работают, мне кажется странным, что git log --decorate по умолчанию поддерживает только один тег на коммит.

Я немного погуглил, но не нашел много.Я что-то упускаю из виду?

PS (на самом деле я использую строку нестандартного формата с %d, согласно страницам руководства и некоторым быстрым тестам, это эквивалентно --decorate)

Ответы [ 3 ]

72 голосов
/ 11 сентября 2014
git log --no-walk --tags --pretty="%h %d %s" --decorate=full

Эта версия также напечатает сообщение о коммите:

 $ git log --no-walk --tags --pretty="%h %d %s" --decorate=full
3713f3f  (tag: refs/tags/1.0.0, tag: refs/tags/0.6.0, refs/remotes/origin/master, refs/heads/master) SP-144/ISP-177: Updating the package.json with 0.6.0 version and the README.md.
00a3762  (tag: refs/tags/0.5.0) ISP-144/ISP-205: Update logger to save files with optional port number if defined/passed: Version 0.5.0
d8db998  (tag: refs/tags/0.4.2) ISP-141/ISP-184/ISP-187: Fixing the bug when loading the app with Gulp and Grunt for 0.4.2
3652484  (tag: refs/tags/0.4.1) ISP-141/ISP-184: Missing the package.json and README.md updates with the 0.4.1 version
c55eee7  (tag: refs/tags/0.4.0) ISP-141/ISP-184/ISP-187: Updating the README.md file with the latest 1.3.0 version.
6963d0b  (tag: refs/tags/0.3.0) ISP-141/ISP-184: Add support for custom serializers: README update
4afdbbe  (tag: refs/tags/0.2.0) ISP-141/ISP-143/ISP-144: Fixing a bug with the creation of the logs
e1513f1  (tag: refs/tags/0.1.0) ISP-141/ISP-143: Betterr refactoring of the Loggers, no dependencies, self-configuration for missing settings.
16 голосов
/ 19 ноября 2010

Примечание о теге tag (tagging a tag), который является источником вашей проблемы, как Charles Bailey , правильно указано в комментарии:

Убедитесь, что вы изучаете эта тема , поскольку переопределение подписанного тега не так просто:

  • , если вы уже нажали тег, справочная страница git tag man серьезно не рекомендуетсяпросто git tag -f B для замены имени тега "A"
  • не пытайтесь воссоздать подписанный тег с помощью git tag -f (см. раздел темы ниже)

    (речь идет о угловом случае, но довольно поучительно в отношении тегов в целом, и это исходит от другого соавтора SO Jakub Narębski ):

Обратите внимание, чтоимя тега (тяжеловесный тег, т. е. объект тега) хранится в двух местах:

  • в самом объекте тега как содержимое заголовка тега (вы можете увидеть его в выводе "git show <tag> ", а также в выводе" git cat-file -p <tag> ", где <tag> - метка в полутяжелом весе, например, v1.6.3 в git.git хранилище),
  • , а также является именем по умолчанию ссылки на тег (ссылка в пространстве имен "refs/tags/*"), указывающей на объект тега.
    Обратите внимание, что тег ссылка (соответствующая ссылка в "refs/tags/*"пространство имен) является чисто локальным веществом;что один репозиторий имеет в 'refs/tags/v0.1.3', другой может иметь, например, в 'refs/tags/sub/v0.1.3'.

Таким образом, когда вы создаете подписанный тег 'A', у вас возникает следующая ситуация (предполагая, что он указывает на некоторый коммит)

  35805ce   <--- 5b7b4ead  <=== refs/tags/A
  (commit)       tag A
                 (tag)

Обратите также внимание, что "git tag -f A A" (обратите внимание на отсутствие опций, заставляющих его быть аннотированным тегом), является пустым -это не меняет ситуацию.

Если вы делаете "git tag -f -s A A": обратите внимание, что вы заставляете писать теги (так что git предполагает, что вы знаете, что делаете), ичто одна из опций -s / -a / -m используется для принудительной установки аннотированного тега (создание объекта тега), вы получите следующую ситуацию

  35805ce   <--- 5b7b4ea  <--- ada8ddc  <=== refs/tags/A
  (commit)       tag A         tag A
                 (tag)         (tag)

Примечаниетакже, что "git show A" покажет всю цепочку до объекта без тега ...

6 голосов
/ 12 января 2014

Примечание: коммит 5e1361c от Брайан м.Карлсон (bk2204) (для git 1.9 / 2.0 Q1 2014) имеет дело с особым случаем с точки зрения оформления бревна с помощью тегов:

log: правильно обрабатывать украшения с помощью цепочечных тегов

git log неправильно обрабатывал декорации, когда объект тега ссылался на другой объект тега, который больше не являлся ссылкой, например, когда был удален второй тег .
Фиксация не будетоформлен правильно, потому что parse_object не был вызван во втором теге, и поэтому его поле тега не было заполнено, в результате чего ни один из тегов не был связан с соответствующим коммитом.

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

Пример:

git tag -a tag1 -m tag1 &&
git tag -a tag2 -m tag2 tag1 &&
git tag -d tag1 &&
git commit --amend -m shorter &&
git log --no-walk --tags --pretty="%H %d" --decorate=full
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...