У каждого тега git есть связанный идентификатор фиксации? - PullRequest
2 голосов
/ 03 июля 2019

Я запустил:

$ git log master

Я получил:

commit 7940b82568e1d28a76557fbb403c46c3ef3cfe90 (tag: prod-api-2019-04-23, master)
Author: Kent Mills <kent.clark@mwzx.com>
Date:   Tue Apr 23 10:33:12 2019 -0700

Мне интересно - в отношении тегов git - каждый тег git имеет уникальный идентификатор фиксации, связанный с ним?

Например, если я запускаю git tag, как я могу узнать, какие идентификаторы фиксации для этих тегов?Что-то вроде git tag --full или что-то.

Ответы [ 3 ]

4 голосов
/ 03 июля 2019

Теги состоят из одной или двух частей:

  • Существует имя тега , которое является ссылкой, очень похоже на имя ветви, за исключением этой ветви 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?

3 голосов
/ 03 июля 2019

Тег похож на ветвь ... другими словами: ветвь / тег - это просто указатель на ревизию ... главное отличие в том, что теги обычно не перемещаются, тогда как ветви движутся все время (даже с чем-то простым, например, когда вы фиксируете) ... и я уверен, что кто-то придумает более простой трюк, но это показывает, куда указывает каждый тег:

git tag | xargs git show --summary
3 голосов
/ 03 июля 2019

имеет ли каждый тег git уникальный идентификатор фиксации, связанный с ним?

Тег git - это просто псевдоним для фиксации (хеш).Псевдоним тега должен быть уникальным.(как упоминал Торек, это также может указывать на что-то еще, кроме коммита, если у него есть идентификатор объекта)

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

Например, если я запустил git tag, как я могу узнать, что идентификаторы коммитов для этих тегов?

Вы можете сделать:

git show-ref --tags -d

пример вывода:

12d265006e50c61512421e88269f4811d52eaf36 refs/tags/v1.0
06d7af2f64d89551ef6324bc44de2454d228f0a8 refs/tags/v1.0-rc1
41137858e7ab5dc353d2478e2454d20735b050a1 refs/tags/v1.0-rc2
066031c9448170466ce8acd4bb5767a1ad02e2e6 refs/tags/v1.0-rc3
0fa020943977759c2fec1575f6fffa6a7799f44f refs/tags/v1.0-rc4
7cf72a2765525cadf2629eb42241d05304330052 refs/tags/v1.0-rc5
00a88fea533e7dfd12b8b17a82f1b57a486ebd00 refs/tags/v1.0-rc6
67a2d071f078be52776a44fe5105b999a8701944 refs/tags/v1.0-rc7
7f9e410a3bc272f4bfc29ea7a3a830883b47f1c2 refs/tags/v1.0.0-rtm-beta5
a0fc4b158f888c0813a9d4867e0627d1525b3fb1 refs/tags/v1.0.0-rtm-beta6
b77b36388895ac1e61d4b886e02e98861010c569 refs/tags/v1.0.0-rtm-beta7
ebc4180644081f893518bda2c0cab1c0d763cb5e refs/tags/v1.0.1
d5547d8cec7e2e7e7c912a8b56ab54cb92933f57 refs/tags/v1.0.2
3d0d78f4a8ae88c9b573d08aaeabc1430780236c refs/tags/v1.1.0
9f59232807ad963b63a3b634e7ebd2256a1ba0e8 refs/tags/v1.2.0
197deb1adf90bced16d04833b671b7e628505fe7 refs/tags/v1.2.1
759c5c2bc687a63fbb41e50de4e8e40ded449c5d refs/tags/v1.3.0
f009ec166256707f6887e65536d9d63f14894bbb refs/tags/v1.4.0
2560e6d313f2cf6800201b7dcfefe424beb2c675 refs/tags/v1.5.0
896e71519655361ef9b513af4d2538fa7b7c87be refs/tags/v1.5.1

Если вам нужно больше контроля, вы можете использовать вывод --format (параметры формата перечислены здесь )

git tag --format '%(refname:strip=2) %(objectname)'

:

v1.0 12d265006e50c61512421e88269f4811d52eaf36
v1.0-rc1 06d7af2f64d89551ef6324bc44de2454d228f0a8
v1.0-rc2 41137858e7ab5dc353d2478e2454d20735b050a1
v1.0-rc3 066031c9448170466ce8acd4bb5767a1ad02e2e6
v1.0-rc4 0fa020943977759c2fec1575f6fffa6a7799f44f
v1.0-rc5 7cf72a2765525cadf2629eb42241d05304330052
v1.0-rc6 00a88fea533e7dfd12b8b17a82f1b57a486ebd00
v1.0-rc7 67a2d071f078be52776a44fe5105b999a8701944
v1.0.0-rtm-beta5 7f9e410a3bc272f4bfc29ea7a3a830883b47f1c2
v1.0.0-rtm-beta6 a0fc4b158f888c0813a9d4867e0627d1525b3fb1
v1.0.0-rtm-beta7 b77b36388895ac1e61d4b886e02e98861010c569
v1.0.1 ebc4180644081f893518bda2c0cab1c0d763cb5e
v1.0.2 d5547d8cec7e2e7e7c912a8b56ab54cb92933f57
v1.1.0 3d0d78f4a8ae88c9b573d08aaeabc1430780236c
v1.2.0 9f59232807ad963b63a3b634e7ebd2256a1ba0e8
v1.2.1 197deb1adf90bced16d04833b671b7e628505fe7
v1.3.0 759c5c2bc687a63fbb41e50de4e8e40ded449c5d
v1.4.0 f009ec166256707f6887e65536d9d63f14894bbb
v1.5.0 2560e6d313f2cf6800201b7dcfefe424beb2c675
v1.5.1 896e71519655361ef9b513af4d2538fa7b7c87be
...