Пошук уроків, статей та іншого контенту
Створите анотовані теги з описом, авторством і датою та навчитеся перевіряти їхні метадані.
Тег Git — це читабельне ім’я для конкретного коміту, наприклад:
v1.0.0Найпростіший тег є легковаговим:
git tag v1.0.0Він лише вказує на коміт і не містить власного опису, автора чи дати створення.
Анотований тег — це окремий об’єкт Git із метаданими:
назвою;
описом;
автором тегу та його email;
датою створення;
посиланням на коміт або інший об’єкт Git.
Анотовані теги зручно використовувати для релізів, оскільки вони зберігають контекст створення версії.
Перед створенням тегу Git використовує ім’я та email із конфігурації користувача:
git config user.name "Olena Developer"
git config user.email "olena@example.com"Щоб створити анотований тег для поточного коміту, використайте параметр -a:
git tag -a v1.0.0 -m "Перший стабільний реліз"У цій команді:
-a або --annotate створює анотований тег;
v1.0.0 — назва тегу;
-m або --message задає повідомлення тегу.
За замовчуванням тег вказує на HEAD, тобто на поточний коміт. За потреби можна явно вказати коміт:
git tag -a v1.0.0 7f3a2c1 -m "Перший стабільний реліз"Також можна створити тег для іншої гілки:
git tag -a v1.0.0 main -m "Перший стабільний реліз"Якщо не передати -m, Git відкриє налаштований текстовий редактор:
git tag -a v1.0.0У редакторі можна ввести багаторядковий опис:
Перший стабільний реліз
Додано:
- автентифікацію користувачів;
- перевірку вхідних даних;
- обробку помилок API.Перший рядок зазвичай використовують як короткий заголовок, а наступні рядки — як детальний опис.
Нижче наведено приклад зі створенням репозиторію, кількох комітів і анотованого тегу.
#!/usr/bin/env bash
set -e
# Створюємо тимчасовий репозиторій
repo_dir="$(mktemp -d)"
cd "$repo_dir"
git init
git config user.name "Olena Developer"
git config user.email "olena@example.com"
printf "# Demo project\n" > README.md
git add README.md
git commit -m "Додати README"
printf "version=1.0.0\n" > version.txt
git add version.txt
git commit -m "Підготувати версію 1.0.0"
# Створюємо анотований тег для поточного коміту
git tag -a v1.0.0 -m "Перший стабільний реліз"
echo "Створені теги:"
git tag
echo
echo "Інформація про тег:"
git show --no-patch v1.0.0
echo
echo "Метадані тегу:"
git for-each-ref \
--format='Назва: %(refname:short)
Автор тегу: %(taggername) <%(taggeremail)>
Дата: %(taggerdate:iso8601)
Опис: %(contents:subject)' \
refs/tags/v1.0.0Команда git show --no-patch v1.0.0 покаже інформацію про об’єкт тегу, але не розгортатиме повний diff коміту.
Список усіх тегів можна отримати так:
git tagДля фільтрації за шаблоном використовуйте -l:
git tag -l "v1.*"Щоб побачити, на які коміти вказують теги:
git show-ref --tagsПриклад результату:
7f3a2c1... refs/tags/v1.0.0Для анотованого тегу це посилання може вказувати на об’єкт тегу, а не безпосередньо на коміт. Щоб побачити сам коміт, використовуйте:
git rev-list -n 1 v1.0.0Або:
git rev-parse v1.0.0^{commit}Суфікс ^{commit} просить Git знайти коміт, на який зрештою посилається тег.
git showНайзручніший спосіб переглянути анотований тег:
git show v1.0.0Типовий результат містить:
назву тегу;
об’єкт, на який він посилається;
тип об’єкта;
ім’я та email того, хто створив тег;
дату створення;
повідомлення тегу;
інформацію про цільовий коміт.
Щоб не показувати diff коміту:
git show --no-patch v1.0.0Щоб вивести лише повідомлення тегу:
git tag -l --format='%(contents)' v1.0.0git cat-fileАнотований тег є об’єктом типу tag. Його внутрішній вміст можна переглянути так:
git cat-file -p v1.0.0Приклад результату:
object 7f3a2c1...
type commit
tag v1.0.0
tagger Olena Developer <olena@example.com> 1710000000 +0200
Перший стабільний релізТут:
object — ідентифікатор об’єкта, на який вказує тег;
type commit — тип цільового об’єкта;
tag — назва тегу;
tagger — автор і дата створення тегу;
текст після порожнього рядка — повідомлення тегу.
git for-each-refДля скриптів і звітів зручно використовувати форматований вивід:
git for-each-ref \
--format='%(refname:short) | %(taggername) | %(taggerdate:iso8601) | %(contents:subject)' \
refs/tagsВажливі заповнювачі:
%(refname:short) — коротка назва тегу;
%(taggername) — ім’я автора тегу;
%(taggeremail) — email автора тегу;
%(taggerdate:iso8601) — дата створення тегу;
%(contents:subject) — перший рядок повідомлення;
%(contents) — повне повідомлення.
У Git потрібно розрізняти автора коміту й автора тегу.
Коміт має, зокрема:
автора змін — author;
того, хто створив коміт — committer.
Анотований тег має окреме поле:
того, хто створив тег — tagger.
Тому автор тегу може відрізнятися від автора коміту. Наприклад, розробник створив коміт, а реліз-менеджер пізніше створив тег v1.0.0.
Переглянути автора тегу можна так:
git for-each-ref \
--format='%(taggername) <%(taggeremail)>' \
refs/tags/v1.0.0Дата тегу також не обов’язково збігається з датою коміту:
git show --format=fuller --no-patch v1.0.0Поточна позиція HEAD не завжди є потрібним комітом. Спочатку можна знайти коміти:
git log --oneline --decorateПотім створити тег для вибраного коміту:
git tag -a v0.9.0 3b18e42 -m "Остання бета-версія"Перевірити, який коміт позначено тегом:
git rev-parse v0.9.0^{commit}Це корисно, коли тег створюють після завершення розробки або для старої версії в історії.
Створення тегу локальне. Воно не надсилає тег до віддаленого репозиторію автоматично.
Надіслати один тег:
git push origin v1.0.0Надіслати всі локальні теги:
git push origin --tagsПісля надсилання інші учасники команди зможуть отримати тег під час завантаження змін:
git fetch origin --tagsПублічні релізні теги бажано не переміщувати на інші коміти після публікації. Тег версії має залишатися незмінним і однозначно відповідати конкретному стану коду.
Анотований тег і криптографічно підписаний тег — не те саме.
Звичайний анотований тег створюється через -a:
git tag -a v1.0.0 -m "Реліз версії 1.0.0"Криптографічно підписаний тег створюється через -s:
git tag -s v1.0.0 -m "Реліз версії 1.0.0"Для -s потрібно заздалегідь налаштувати ключ підпису та програму підписування. Такий тег містить цифровий підпис, який можна перевірити:
git tag -v v1.0.0Команда git tag -v перевіряє саме криптографічний підпис. Вона не потрібна для звичайного анотованого тегу.
У цій темі під «підписаними анотованими тегами» маються на увазі теги з власним описом, авторством і датою. Для цифрової автентифікації потрібно додатково використовувати git tag -s.
git tag v1.0.0Такий тег не має повідомлення й метаданих тегу.
Для анотованого тегу використовуйте:
git tag -a v1.0.0 -m "Реліз версії 1.0.0"Автор тегу визначається конфігурацією Git у момент створення тегу:
git config user.name
git config user.emailПеред створенням релізного тегу перевірте ці значення.
Команда:
git tagпоказує лише список назв. Вона не показує опис, автора або дату.
Для метаданих використовуйте:
git show --no-patch v1.0.0git tag -vКоманда:
git tag -v v1.0.0призначена для перевірки цифрового підпису. Звичайний анотований тег, створений через -a, не має криптографічного підпису.
Примусове переміщення тегу:
git tag -f -a v1.0.0 <інший-коміт> -m "..."
git push --force origin v1.0.0може порушити очікування інших учасників команди. Опублікований тег релізу краще не змінювати. Якщо потрібен новий стан коду, створіть нову версію тегу.
Створіть анотований тег і перевірте його за допомогою таких команд:
git tag -a v1.0.0 -m "Перший стабільний реліз"
git show --no-patch v1.0.0
git cat-file -p v1.0.0
git for-each-ref \
--format='%(refname:short) | %(taggername) | %(taggerdate:iso8601) | %(contents:subject)' \
refs/tags/v1.0.0У результаті ви маєте побачити:
назву тегу v1.0.0;
коміт, на який він вказує;
ім’я та email автора тегу;
дату створення;
повідомлення Перший стабільний реліз.
Анотований тег є окремим об’єктом Git із метаданими.
Для його створення використовуйте git tag -a.
Опис тегу задається через -m або в текстовому редакторі.
Автор і дата тегу зберігаються окремо від автора й дати коміту.
git show показує загальну інформацію про тег.
git cat-file -p показує внутрішню структуру об’єкта тегу.
git for-each-ref зручно використовувати для отримання метаданих у потрібному форматі.
Для надсилання тегу використовуйте git push origin <назва-тегу>.
Криптографічно підписані теги створюються через git tag -s і перевіряються через git tag -v.