Почему я должен заботиться об облегченных и аннотированных тегах?

В прошлом году я перешел с Subversion на Git в качестве повседневной системы управления версиями и все еще пытаюсь понять тонкости "Git-think".

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

Когда я впервые переключился на Git, легкие метки казались лучшей вещью со времен нарезанного хлеба; Я мог бы просто указать на коммит и сказать "это было 1.0". У меня возникают проблемы с пониманием того, что тег может когда-либо быть чем-то большим, но я, конечно, не могу поверить, что эксперты Git всего мира предпочитают аннотированные теги произвольно! Так о чем же все это?

(Бонусные баллы: зачем мне подписывать тег?)

РЕДАКТИРОВАТЬ

Я был успешно убежден, что аннотированные теги - хорошая вещь - знать, кто отметил, и когда это важно! Как продолжение, какой-нибудь совет относительно хороших аннотаций тега? И то и другое git tag -am "tagging 1.0" 1.0 и пытаться суммировать журнал фиксации, так как предыдущий тег кажется потерянным.

8 ответов

Решение

Большой плюс аннотированного тега в том, что вы знаете, кто его создал. Как и в случае с коммитами, иногда приятно знать, кто это сделал. Если вы разработчик и видите, что v1.7.4 помечен (объявлен готовым), и вы не уверены, с кем вы общаетесь? Человек, чье имя есть в аннотированном теге! (Если вы живете в недоверчивом мире, это также не дает людям помечать то, что им не следует.) Если вы являетесь потребителем, это имя является печатью авторитета: это Хунио Хамано говорит, что эта версия git настоящим вышел.

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

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

Редактировать:

Что касается того, что писать в аннотации тега, вы правы - не всегда можно сказать много полезного. Для тега номера версии подразумевается, что он помечает эту версию, и если вы довольны своими журналами изменений в другом месте, нет необходимости размещать их там. В этом случае действительно важны тегер и дата. Единственное, о чем я могу подумать, это что-то вроде одобрения тестового набора. Посмотрите на теги git.git: все они просто говорят что-то вроде "Git 1.7.3 rc1"; все, что нас действительно волнует, это имя Хунио Хамано на них.

Однако для менее явно названных тегов сообщение может стать гораздо более важным. Я мог бы представить тегирование конкретной специализированной версии для одного пользователя / клиента, некоторого важного этапа, не относящегося к версии, или (как упомянуто выше) кандидата на выпуск с дополнительной информацией. Сообщение тогда намного более полезно.

Мой личный, немного другой взгляд на эту тему:

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

По умолчанию Git смотрит только на аннотированные теги как на базовую линию для таких команд, как git describe, Думайте о помеченных тегах как о знаках, которые имеют непреходящее значение для вас и других, в то время как облегченные теги больше похожи на закладки, которые вы сможете найти позже. Следовательно, аннотированные теги стоит использовать в качестве ссылки, в то время как легкие теги не должны быть.

Подписание тега является гарантией личности подписавшего. Это позволяет пользователям проверять, например, что выбранный ими код ядра Linux - это тот же код, который фактически выпустил Линус Торвальдс. Подпись также может быть подтверждением того, что подписывающий ручается за качество и целостность программного обеспечения на этом коммите.

Нажмите аннотированные метки, сохраняйте вес локальным

Определенные поведения Git делают различия между ними так, как эта рекомендация полезна, например:

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

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

  • git push --follow-tags будет толкать только аннотированные теги
  • git describe без параметров командной строки видит только аннотированные теги

man git-tag говорит:

Аннотированные теги предназначены для выпуска, в то время как легкие теги предназначены для меток частных или временных объектов.

Внутренние различия

  • как легкие, так и аннотированные теги являются файлом под .git/refs/tags который содержит SHA-1

  • для легких тегов SHA-1 указывает непосредственно на коммит:

    git tag light
    cat .git/refs/tags/light
    

    печатает так же, как SHA-1 ГОЛОВКИ.

    Поэтому неудивительно, что они не могут содержать никаких других метаданных.

  • аннотированные теги указывают на объект тега в базе данных объекта.

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    содержит SHA аннотированного тегового объекта:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    и тогда мы можем получить его содержание с:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    образец вывода:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <your@mail.com> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    И вот как он содержит дополнительные метаданные. Как мы видим из вывода, поля метаданных:

    Более подробный анализ формата представлен по адресу: Что такое формат объекта тега git и как рассчитать его SHA?

Бонусы

Подписание тега - это простой способ подтвердить подлинность релиза.

Это особенно полезно в DVCS, потому что любой может клонировать репозиторий и изменять историю (например, через git-filter-branch). Если тег подписан, подпись не будет действовать после операции git-filter-branch, поэтому, если у вас есть политика, согласно которой каждый выпуск помечается и подписывается коммиттером, можно обнаружить поддельный тег выпуска в репозитории.

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

Я нашел одно хорошее применение для легких тегов - создание релиза на GitHub в ретроспективе.

Мы выпустили наше программное обеспечение, и у нас были необходимые коммиты, мы просто не удосужились поддержать раздел "Release" на GitHub. И когда мы уделили этому немного внимания, мы поняли, что хотели бы также добавить несколько предыдущих выпусков с правильными старыми датами их выпуска.

Если бы мы просто создали аннотированный тег на старом коммите, GitHub взял бы дату выпуска из объекта тега. Напротив, когда мы создали облегченный тег для этого старого коммита, в релизе начали показываться правильные (старые) даты. Источник @ GitHub help, 'О выпусках'

Кажется, также возможно указать желаемую дату для аннотированного коммита, но для меня это выглядит не так просто: https://www.kernel.org/pub/software/scm/git/docs/git-tag.html

В моем офисе мы разместим адрес веб-страницы релиза в теле тега. На веб-странице релиза подробно описаны все новые функции и исправления, появившиеся после последнего выпуска. Руководство не будет искать в git-репозитории информацию о произошедших изменениях, и было бы неплохо иметь краткий список того, что в этом выпуске.

Для меня важным отличием является то, что легкий тег не имеет отметки времени. Допустим, вы добавили несколько легких тегов:

git tag v1
git tag v2
git tag v3

а затем, может быть, позже, вы хотите получить последний добавленный легкий тег. Нет способа сделать это. Ни "git description", ни "git tag" не дадут вам хронологически последний легкий тег. "git tag -l" может вернуть их все или отсортировать в лексическом порядке, но не по дате / времени. "git description --tags" вернет "v1", который определенно не является последним добавленным тегом.

С другой стороны, если вы добавите аннотированные теги:

git tag v1 -m v1
git tag v2 -m v1
git tag v3 -m v1

вы всегда можете получить отметку времени каждого тега, и "git description" обязательно вернет "v3", который является последним добавленным тегом.

Аннотированные теги хранят дополнительные метаданные, такие как имя автора, заметки о выпуске, сообщение-тег и дату, как полные объекты в базе данных Git. Все эти данные важны для публичного релиза вашего проекта.

git tag -a v1.0.0

Облегченные теги - это самый простой способ добавить тег в репозиторий git, поскольку они хранят только хэш коммита, на который они ссылаются. Они могут действовать как "закладки" для коммита, поэтому они отлично подходят для частного использования.

git tag v1.0.0

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

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