Чому я повинен дбати про легкі та позначені теги?


346

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

Той, що мене турбує останнім часом, - це "легкий" порівняно з анотованими та підписаними тегами. Здається, загальновизнано, що анотовані теги перевершують легкі теги для реального використання, але я знайшов пояснення, чому це так завжди, як правило, зводиться до "тому, що найкращі практики" або "тому, що вони різні" . На жаль, це дуже незадовільні аргументи, не знаючи, чому це найкраща практика або як ці відмінності стосуються мого використання Git.

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

(Бонусні бали: навіщо мені колись потрібно підписувати тег?)

EDIT

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


Ви знайшли гарну відповідь для свого подальшого дослідження? Щось на зразок? git log --pretty=oneline master..HEAD | git tag -a -F - $BRANCH.$BUILD_NUMBER
сміливо

Узагальнення журналу фіксації з попереднього тегу мені здається відмінною стратегією для повідомлень про теги.
рубін

FYI (1.) Щоб перерахувати тег LIGHTWEIGHT за датою, перейдіть сюди . (2.) Щоб перерахувати АННОТОВАНИЙ тег за датою, перейдіть сюди .
Тревор Бойд Сміт

Відповіді:


272

Великий плюс поміченого тегу - це те, що ви знаєте, хто його створив. Так само, як і при комітах, іноді приємно знати, хто це зробив. Якщо ви розробник і бачите, що v1.7.4 позначено тегом (оголошено готовим), і ви не настільки впевнені, з ким ви спілкуєтесь? Людина, чиє ім’я міститься в примітці з примітками! (Якщо ви живете в недобросовісному світі, це також не дає людям ухилятися від маркування речей, які вони не повинні.) Якщо ви споживач, це ім'я є печаткою влади: саме Хуніо Хамано говорить, що ця версія git справжня звільнений.

Інші метадані також можуть бути корисними - іноді приємно знати, коли вийшла ця версія, а не лише коли було зроблено остаточне зобов’язання. І іноді повідомлення може бути навіть корисним. Можливо, це допоможе пояснити мету саме цього тегу. Можливо, тег для кандидата на реліз містить трохи списку статусу / завдання.

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

Редагувати:

Щодо того, що написати в примітці до тегів, ви праві - не завжди можна сказати багато корисного. Щодо тегу номер версії неявно розуміється, що він позначає цю версію, і якщо ви задоволені своїми журналами змін в іншому місці, не потрібно розміщувати її. У цьому випадку насправді найважливішими є теггер і дата. Єдине інше, що я можу придумати, - це певний знак затвердження з тестового набору. Погляньте на теги git.git: вони просто говорять щось на кшталт "Git 1.7.3 rc1"; все, що нас насправді хвилює, це ім'я Хуніо Хамано.

Однак для менш очевидно названих тегів повідомлення може стати набагато важливішим. Я міг би передбачити маркування конкретної версії спеціального призначення для одного користувача / клієнта, якусь важливу віху неверсійної версії або (як було сказано вище) кандидата на реліз із додатковою інформацією. Тоді повідомлення набагато корисніше.


4
просто для порівняння зі SVN, оскільки ОП надходить із цієї системи: анотовані метадані тегу еквівалентні фактичній зміні SVN, робить гілку тегів, яка у SVN має свого автора та повідомлення. І, можливо, окремі обмеження щодо того, хто може зробити тег, відмінні від того, хто може перевірити зміни - відмінність, яка не має значення, якщо ви просто використовуєте систему для власних речей.
araqnid

10
А-ха! Здається, моє розуміння тут заважало тому, що всі мої проекти Git поки що були сольними. Мені ніколи не потрібно було знати, хто винен у чомусь (це завжди я!), Тому я не помітив, що легкі теги не відслідковують теггер.
Бен Бланк

5
git help logтепер підсумовує це так: "Помічені теги призначені для випуску, тоді як легкі теги призначені для приватних або тимчасових міток об'єкта."
Джон Gjengset

1
@javabrett Хоча це є гарною частиною відповіді на те, "які відмінності між поміченими та полегшеними тегами", питання тут було конкретно, чому люди хочуть зберігати додаткову інформацію і, таким чином, використовувати примітки з примітками. (І я не думаю, що я можу серйозно сказати, що "це створює крапку" - це недолік - ви робите те, що вам потрібно зробити, щоб зберігати інформацію, яку ви хочете зберегти, і якщо це важлива інформація, вона вимагатиме краплі. )
Каскабель

1
@Chris так, як говориться у відповіді, "Великий плюс примітки з примітками в тому, що ви знаєте, хто його створив". Ви завжди можете самі спробувати речі, щоб дізнатися:git tag -a -m 'my message' my-tag; git show my-tag
Cascabel

64

Моє особисте, трохи інше бачення на цю тему:

  • Помічені теги - це теги, які мають бути опубліковані для інших розробників, найімовірніше, нові версії (які також слід підписати). Не тільки для того, щоб побачити, хто позначав тег і коли його було позначено, але і чому (як правило, журнал змін).
  • Легкі ваги є більш підходящими для приватного використання, це означає тегування спеціальних комісій, щоб мати можливість їх знову знайти. Може бути, їх переглянути, перевірити, щоб тестувати щось чи що завгодно.

4
Це також згадується на осіб , ГИТ-тезі: «Анотовані теги призначені для випуску в той час як легкі мітки призначені для приватних або тимчасових об'єктів етикеток.»: Stackoverflow.com/a/35059291/895245
Чіро Сантіллі郝海东冠状病六四事件法轮功

28

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

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


1
git push --follow-tagsще одна команда , яка лікує як по- різному: stackoverflow.com/a/26438076/895245
Чіро Сантіллі郝海东冠状病六四事件法轮功

1
Дякую за підказку о git describe. Я використовую його в системі безперервної інтеграції, і кілька разів версія рядка не була такою, яку я очікував.
jjmontes

9

Підписання тегу - простий спосіб підтвердити справжність випуску.

Це особливо корисно для DVCS, оскільки кожен може клонувати сховище та змінювати історію (наприклад, через гіт-фільтр-гілку). Якщо тег підписаний, підпис не переживе операцію гілки git-filter, тож якщо у вас є політика, що кожний реліз позначається тегом та підписом комітером, можна виявити тег звільнення з фільтром у сховищі.

Якби не підписання, я також не побачив би великого сенсу в анотованих тегах.


1
Власне, для цього може бути корисним підпис, який підписує лише заповідне дерево, а не всю його історію (мені байдуже, чи хтось підробляє історію, я хочу бути впевненим, що я маю правильний код).
Paŭlo Ebermann

9

Надішліть мітки з примітками, зберігайте легкі місцеві

Деякі поведінки Git відрізняються між собою так, як ця рекомендація корисна, наприклад:

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

    Легкі теги не мають такої додаткової інформації і не потребують її, оскільки ви її збираєтеся використовувати лише для розробки.

  • git push - наступні теги натискатимуть лише теги
  • git describe без параметрів командного рядка відображаються лише помічені теги

man git-tag каже:

Помічені теги призначені для випуску, тоді як легкі теги призначені для приватних або тимчасових міток об'єктів.

Внутрішні відмінності

  • і легкі, і помічені теги - це файл, .git/refs/tagsщо містить SHA-1

  • Щодо легких тегів, SHA-1 вказує безпосередньо на комісію:

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

    друкує те саме, що і SHA-1 HEAD.

    Тож недарма вони не можуть містити жодних інших метаданих.

  • анотовані теги вказують на об’єкт тегів у базі даних об’єктів.

    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 tag і як обчислити його SHA?

Бонуси


6

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

Ми випустили наше програмне забезпечення, і ми взяли на себе необхідні зобов’язання, просто не потрудилися підтримувати розділ «Випуск» на GitHub. І коли ми приділили цьому трохи уваги, ми зрозуміли, що хотіли б додати і деякі попередні випуски з правильними старими датами випуску для них.

Якщо ми просто створимо маркований тег на старому комітеті, GitHub прийме дату для виходу з об’єкта тегу. На відміну від цього, коли ми створили легкий тег для цієї старої комісії, випуск почав показувати правильну (стару) дату. Довідка @ GitHub "Про випуски"

Здається, також можна вказати бажану дату для поміченого комітету, але мені це не так просто: https://www.kernel.org/pub/software/scm/git/docs/git-tag. html # _on_backdating_tags


Хоча сьогодні я дізнався, що GitHub перестав вшановувати дати для мене (як для легких, так і для приміток). Він просто ігнорує дату при публікації релізу і замість цього запам'ятовує дату та час, коли я натиснув кнопку "Опублікувати" для випуску.
evilkos

Так, я також натрапив на цей безлад про GitHub та помічені теги. Я не зрозумів, чому вони реалізували це таким чином ..
YakovL

1

У моєму кабінеті ми помістимо адресу веб-сторінки випуску в тег тегу. Веб-сторінка випуску детально описує всі нові функції та виправлення після останнього випуску. Керівництво не буде шукати в git repo, щоб дізнатися, які зміни відбулися, і приємно мати стислий перелік того, що знаходиться у цьому випуску.


0

Помічені теги зберігають додаткові метадані, такі як ім'я автора, нотатки до випуску, повідомлення про теги та дату як повноцінні об’єкти в базі даних Git. Усі ці дані важливі для публічного випуску вашого проекту.

git тег -a v1.0.0

Легкі теги - це найпростіший спосіб додати тег до вашого сховища git, оскільки вони зберігають лише хеш комітетів, на які вони посилаються. Вони можуть діяти як "закладки" для виконання зобов'язань, тому вони чудово підходять для приватного використання.

git тег v1.0.0

Ви можете сортувати, списувати, видаляти, показувати та редагувати старі теги. Усі ці функції допоможуть вам визначити конкретні версії вашого коду. Я знайшов цю статтю, яка може допомогти вам краще зрозуміти, що можна зробити тегами.


0

Для мене важливою відмінністю є те, що у легкій мітці немає часових позначок. Скажімо, ви додали кілька полегшених тегів:

git tag v1
git tag v2
git tag v3

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

З іншого боку, якщо ви додаєте помічені теги:

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

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


Ви повинні використовувати -a, щоб це можна було анотувати.
Олексій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.