Как я могу определить разницу во времени между тегом git и исходной фиксацией

#git #git-tag

#git #git-tag

Вопрос:

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

Это то, что у меня есть до сих пор, однако дата фиксации, которую я считаю правильным полем, равна нулю.

 git for-each-ref --format='%(taggerdate) : %(committerdate) :  %(refname)' --sort=-taggerdate --count=10 refs/tags
  

На мой взгляд, я смотрю только на теги, хотя я не могу понять это правильно. В идеальном мире это показало бы разницу между временами, однако я могу сделать это позже, если это невозможно.

Комментарии:

1. Теги… облегченный или аннотированный? ( git-scm.com/book/en/v2/Git-Basics-Tagging#Annotated-Tags )

2. Это аннотированные теги, установленные через team city

Ответ №1:

git for-each-ref Документация вводит в заблуждение:

Для объектов фиксации и тегов специальные creatordate creator поля и будут соответствовать соответствующему кортежу даты или имени-электронной почты-даты из полей committer или tagger в зависимости от типа объекта. Они предназначены для работы с сочетанием аннотированных и облегченных тегов.

Это работает точно так, как задокументировано: %(creatordate) получает дату из tagger поля этих аннотированных тегов. Однако, похоже, это подразумевает, что для аннотированного тега Git может проверять соответствующий коммит: если нет, то как он когда-либо получит committer ?

На самом деле, for-each-ref никогда не просматривается непосредственно целевой объект аннотированного тега. Упоминание committer поля относится к облегченным тегам, которые указывают на фиксации1, а не на объекты аннотированных тегов. К счастью, есть директива format, в которой говорится, что «смотреть косвенно», так сказать: просто префикс директивы с * .2

Следовательно, ответ:

 git for-each-ref 
    --format='%(taggerdate) : %(*committerdate) :  %(refname)' 
    --sort=-taggerdate --count=10 refs/tags
  

1 Легкие теги могут указывать непосредственно на деревья или большие двоичные объекты; не сразу понятно, что происходит в этом случае. Вероятно, расширение пустое.

2 Обратите внимание, что это только косвенное указание один раз, поэтому, если целью аннотированного тега является другой тег (или дерево или большой двоичный объект), поле даты фиксатора не будет. Чтобы действительно сделать это надежным, вам, вероятно, следует использовать немного сценария оболочки и разрешить имя тега с ^{} ^{commit} помощью суффикса or . (Разница между этими двумя заключается в том, что ^{commit} произойдет сбой, если конечным целевым объектом является дерево или большой двоичный объект, в то время ^{} как будет успешным, найдя это дерево или объект blob.)