Почему аннотированный объект тега хранит имя тега? - PullRequest
0 голосов
/ 25 апреля 2018

Как видно из этого ответа , тег git с комментариями имеет несколько свойств, например

> git cat-file -p v0.1

object 5cf4de319291579d4416da8e0eba8a2973f8b0cf
type commit
tag v0.1
tagger JDB <jd@domain.com> 1521058797 -0400

Version 0.1-beat

Первые два свойства дают SHA1 и тип целевого объекта, на который указывает тег. Третье свойство дает имя тега, v0.1.

Но этот тег представлен в виде файла .git/refs/tags/v1.0. Таким образом, у нас уже есть способ сопоставить строку v0.1 с объектом тега и его свойствами. Зачем нам нужен объект тега для включения имени тега в его свойства? Филиалы не хранят свои имена. Объекты коммитов не хранят свои SHA1. Есть ли ситуации, когда у вас есть ссылка на тег, но не на его имя?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Помимо вашего собственного ответа (тег указывает на тег по идентификатору объекта), по другим причинам вам может потребоваться, чтобы объект тега сохранял имя тега:

  • Если ссылка «свободная», то, как вы говорите, она сохраняется как .git/refs/tags/v0.1. Но это может быть упаковано вместо этого. Поэтому, если вы хотите использовать метаданные refs для сопоставления имени тега, это не так просто. (В любом случае, ручное копирование в каталоге .git всегда должно быть в лучшем случае планом B.)

  • Хеш объекта, а в случае подписанных тегов подпись не будет охватывать имя файла тега. Если вам нужна уверенность, что фиксация 5cf4de319 - это то, что подразумевается под «v0.1», то вам нужен объект тега для явного хранения этого факта.

UPDATE

Я опять не уверен, переходит ли это в «практически важную» причину, но вот еще одна вещь, о которой стоит подумать:

Чем на самом деле отличается аннотированный тег от облегченного тега, указывающего на объект тега из аннотированного тега? Лучший ответ, который у меня есть: несоответствие имени.

0 голосов
/ 25 апреля 2018

ОК, ответ, на который я ссылался в этом вопросе, также содержит ключ к ответу на этот вопрос: тег, указывающий на тег, использует SHA1 целевого тега, а не его имя, в качестве ссылки.

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

Может быть, есть и другие причины, но об этом я мог подумать.Возможно, есть другие вещи (помимо тега), которые могут ссылаться на тег по его SHA1, и поэтому необходимо, чтобы имя ссылочного тега было предоставлено ссылочным объектом тега.

...