LINUX.ORG.RU

Как в Git сделать Tag или Notes в момент коммита, а не после?

 , , ,


0

1

Никак не могу понять.

Такое впечатление, что в Git невозможно сделать коммит, который был бы помечен тегом или имел заданную Notes.

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

Получается, что так сделать нельзя? Надо вначале закоммитить изменения, потом выяснить ID этого коммита, а потом отдельной командой создать Tag или Notes? В момент коммита создать Tag или Notes невозможно?

★★★★★

Git supports two types of tags: lightweight and annotated. A lightweight tag is very much like a branch that doesn’t change — it’s just a pointer to a specific commit. Annotated tags, however, are stored as full objects in the Git database. They’re checksummed; contain the tagger name, email, and date; have a tagging message; and can be signed and verified with GNU Privacy Guard (GPG). It’s generally recommended that you create annotated tags so you can have all this information; but if you want a temporary tag or for some reason don’t want to keep the other information, lightweight tags are available too.

То есть теги не принадлежат коммитам, и технически коммиты не «помечаются» тегом. Сначала создается коммит, а потом создается тег как отдельная сущность, содержащая ссылку на коммит.

FishHook
()

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

Или написать Notes с номером версии в момент создания коммита.

Так пиши в описании коммита: хочешь в коротком, хочешь в развёрнутом.

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 3)

Что-то ты странное пишешь. Сообщение коммита добавляется в качестве параметра коммита, потом создаёшь тэг:

git commit -m "Версия 1.2"
git tag 1.2

тэг по умолчанию вешается на HEAD. И получается именно то, что ты хотел: нужный тебе коммит снабжён нужным тебе текстом, и на нём висит соответствующий тэг.

Beewek ★★
()
Ответ на: комментарий от Beewek

И получается именно то, что ты хотел

Нет. Ты только что подтвердил что в Git невозможно установить тег в момент создания коммита. Ты вначале создал коммит, а потом прикрепил к нему тег.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Если под фразой «в момент создания» ты имел в виду «одной командой», то да, нельзя. А двумя командами - пожалуйста. И будь уверен, что ты не промахнёшься мимо HEAD, даже если задежка между командами будет несколько минут :-)

Beewek ★★
()
Ответ на: комментарий от Beewek

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

Выходит, что сделать это можно только через message самого коммита. Других возможностей нет.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Я всё равно не понял, что значит «подготовить коммит». Вот твои шаги:

  1. сделал изменения в рабочей копии
  2. добавил нужную их часть в индекс (git add)
  3. делаешь коммит (git commit -m «v 1.2»)
  4. вешаешь тэг (git tag 1.2).

Какие из этих пунктов входят в «подготовить коммит»?

А, я понял. Ты хочешь, чтобы тэг добавлялся в момент git add, и потом коммитился? Такой возможности нет, насколько я знаю.

Beewek ★★
()
Ответ на: комментарий от Xintrea

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

Записи в CHANGELOG именно для этого и делают. Меняешь версию в version.h, делаешь запись в CHANGELOG и коммитишь.

anonymous
()
Ответ на: комментарий от Xintrea

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

Вряд ли задача сформулирована именно так.

Если хочешь вешать тег - он вешается на уже существующий коммит.

Если хочешь версионирование в каком-то виде - можно это сделать без тегов, коммитами в файлы в репозитории.

AnDoR ★★★★★
()
Ответ на: комментарий от Xintrea

Пишешь git commit -m Новая суперфича! и получаешь короткое описание.

Пишешь git commit, открывается окно текстового редактора и там пишешь:

Новая суперфича!

В данной суперфиче реализовано 
бла-бла-бла
много текста на несколько строк.
grem ★★★★★
()
Ответ на: комментарий от dataman

Да-да, все побежали fossil вместо vcs использовать только потому что там тэг можно коммитом создать. И эти люди ещё смеют говорить что git - перегруженный монстр где одна команда делает всё подряд.

anonymous
()
Ответ на: комментарий от LongLiveUbuntu

Ну формально в момент коммита нет и tree объектов на которые он ссылается - они создаются вместе с коммитом. Так же можно создать и тэг. Вот только зачем?

anonymous
()

Получается, что так сделать нельзя? Надо вначале закоммитить изменения, потом выяснить ID этого коммита, а потом отдельной командой создать Tag или Notes? В момент коммита создать Tag или Notes невозможно?

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

Хотя естественно, никто тебе не запрещает запилить в конфиге git кастомную команду, делающую git commit && git tag

Lrrr ★★★★★
()
Ответ на: комментарий от grem

Его ещё ждёт сюрприз, связанный с тем, что git push не отправит tag на сервер ;)

Эту особенность я зафиксировал в 2018 году

https://webhamster.ru/mytetrashare/index/mtb0/1518189662ppq0z9hcry

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Аннотированный тэг без аннотирования? О_о

На самом деле хорошо, что тэг только условно привязывается к коммиту. Это позволяет переносить их, удалять и т.д.

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)