Теги состоят из одной или двух частей:
Существует имя тега , которое является ссылкой, очень похоже на имя ветви, за исключением этой ветви b
имеет полное имя refs/heads/b
, а тег t
имеет полное имя refs/tags/t
.
Все ссылки хранят один (1) хэш-идентификатор.Имена ветвей ограничены для хранения только коммитов хеш-идентификаторов, хотя существует четыре типа объектов: коммит, дерево, BLOB-объекты и аннотированный тег.Таким образом, имена тегов не ограничиваются.
Если хэш-идентификатор, сохраненный в ссылке на тег, является идентификатором объекта тега, сам объект тега хранит больше данных.Данные включают в себя:
- имя тега;
- необязательный ключ PGP;
- идентификатор хеш-функции другого объекта Git.
Другой объект Git здесь обычно коммит, но это не сложное и быстрое требование: как ссылка на тег, объект тега может указывать на другой объект любого типа, даже другойобъект тега.
Когда имя тега указывает на объект тега, Git вызывает аннотированный тег .В противном случае Git вызывает ссылку на облегченный тег .
Чтобы превратить ссылочное имя в объект , используйте git rev-parse
:
git rev-parse refs/heads/master
git rev-parse refs/tags/v1.2
например.По умолчанию git rev-parse
находит идентификатор хеша целевого объекта и останавливается на этом, но вы можете дать ему команду продолжать:
Суффикс ^{commit}
сообщает git rev-parse
, что если объектСам по себе не коммит, но может привести к коммиту, продолжайте работать.Если объект в конечном итоге приводит к фиксации - например, если объект является объектом тега и его целью является другой объект тега, а целью этого второго объекта тега является фиксация - этот «следующий» процесс завершается успешно, и git rev-parse
печатает идентификаторкоммит.Если объект в конечном счете ведет в другое место, например, если объект является объектом тега, но целью этого объекта тега является BLOB-объект, операция завершается неудачно, и git rev-parse
выводит сообщение об ошибке в stderr, а идентификатор хеш-функции - в stdout
Суффикс ^{tree}
или ^{blob}
указывает Git следовать тегам или коммитам в их дереве или в BLOB-объектах.Поскольку каждый объект коммита имеет ровно одно дерево, суффикс ^{tree}
успешно выполняется, если имя указывает на объект тега, который указывает на коммит.Это также успешно, если имя указывает непосредственно на дерево - возможно и для облегченных и для аннотированных тегов.Однако суффикс ^{blob}
может быть успешным только в том случае, если тег указывает на большой двоичный объект (напрямую, в виде облегченного тега или косвенно через некоторое количество объектов тегов), поскольку нет четко определенного способа перехода от коммита или дерева кодин конкретный BLOB-объект: деревья обычно содержат множество хэш-идентификаторов BLOB-объектов.
Суффикс ^{}
направляет git rev-parse
на очистку тега.То есть, если имя является именем тега, а объект первого уровня является объектом тега, Git должен следовать за этим объектом.Если получающийся объект является другим объектом тега, Git должен следовать за , что также.Git должен повторять это до тех пор, пока тег не преобразуется в любой объект без тега - любой коммит, дерево или BLOB-объект.Затем git rev-parse
должен выдать хеш-идентификатор этого объекта без тега.
Несколько других команд Git могут быть использованы для очистки тегов, а некоторые делают это даже без вашего ведома.Например, git ls-remote
вызывает другой Git и заставляет другой Git сообщать вашему Git о его ссылках - включая имена тегов - и их хеш-идентификаторы объектов.Когда их Git сообщает вашему Git об одном из имен своих тегов, его Git создает оба объекта тега верхнего уровня, если таковые имеются, и идентификатор хэша очищенного объекта.Это выглядит как:
<hash1> refs/tags/<tag>
<hash2> refs/tags/<tag>^{}
Здесь hash1
- это идентификатор объекта аннотированного тега, а hash2
- это идентификатор объектаокончательный объект без тега, полученный процессом очистки (такой объект по определению должен всегда быть).
Если вы не см. Эту аннотацию в выводе git ls-remote
для объекта тега, что означает, что их тег является легковесным тегом, указывающим непосредственно на объект коммита, дерева или BLOB-объекта, чей идентификатор хеша указан.
Команда git for-each-ref
имеет директиву *
для следования тэгам:
Если имя поля имеет префикс со звездочкой (*
), а ссылки указывают наобъект тега, используйте значение для поля в объекте, на который ссылается объект тега (вместо поля в объекте тега).
Из документации не ясно, полностью ли это очищаетили просто на один уровень ниже: если аннотированный тег X имеет своей целью объект-аннотированный тег аннотированного тега Y, который в качестве цели Y содержит коммит C, %(*objectname)
создает хэш Y или хэш C?