2017-02-10 25 views
0

git branch -avv показывает все ветви (в том числе удаленные), украшая их веткой отслеживания, короткой SHA и заголовком фиксации. Есть ли аналогичная команда для отображения всех тэгов вместе с сообщением, на которое они указывают, необязательно, в том числе, будет ли он вставлен вверх по потоку, и, кроме того, с сообщением, если тег был аннотирован?Как получить git-branch -avv как список тегов?

Лучшее, что я мог бы получить до сих пор:

git tag --format '%(color:green)%(refname:short)%09%(color:white)%(objectname:short) %(contents:subject)' 

Но есть несколько проблем:

  • В зависимости от тега длины, выравнивание по %09\t) не
  • Нет способа узнать, является ли бирка легким или нет (%(objecttype) отображает это как commit или tag, но я бы предпочел что-то вроде аннотации тега на следующей строке)
  • %(objectname:short)тег SHA для аннотированных тегов, тогда как я хочу знать, на что они указывают.

Эти последние два сводятся в основном хотят, какие git show-refs --tags -d шоу, но это не дает --format.

ответ

1

В достаточно современной Git (вы явно есть здесь), разновидности листинга git branch и git tag (включая даже --contains и тому подобное) просто специализаций git for-each-ref, бегите за refs/heads/ и refs/tags/ пространств имен соответственно.

С git for-each-ref - это команда сантехника, однако вы можете использовать ее для написания скрипта, который делает все, что угодно. Нам понадобится это через мгновение.

Большая часть того, что вы хотите, напрямую кодируется в for-each-ref директивами %. Так как ваш git tag достаточно современен, чтобы взять --format в первую очередь, вы можете просто использовать git tag прямо для большей части этого в любом случае. В любом случае, стоит тщательно изучить the git for-each-ref documentation, поскольку директивы --format на удивление сложны.

Вместо %(objectname:short), вы можете использовать %(*objectname:short), чтобы получить цель тега (* действия распространяется только на аннотированные объекты тегов, это не не-оп на других объектах).

Одна сложная проблема - выравнивание столбцов. Существует директива %(align:position,width) (начиная с Git 2.8), которая заботится о большей части проблемы. (Вы можете по буквам это как %(align:position=num,width=num), если вы предпочитаете.) Так как ваш средний столбец, укороченный OID, является фиксированной шириной, нам нужно только один %align:

git tag --format '%(align:1,20)%(color:green)%(refname:short)%(end) 
%(color:white)%(*objectname:short) %(contents:subject)' 

(я сломал это в две строки для отображения целей). Вопрос об obvoius здесь: Где мы получили магическую константу 20?

Ответ: это был всего лишь WAG.Если вы хотите, чтобы вычислилправильный номер, нам нужно два прохода: один для подсчета максимальной ширины любого тега, а второй - для отображения тегов. «Посчитать максимальную ширину», где нам действительно нужно git for-each-ref, поскольку нам нужно немного сценариев оболочки:

# Output the length of the longest tag. If there are no tags, 
# print 0 (most logically correct but some callers might want 1; 
# consider making a minimum output value an argument, which is 
# trivial to do: initialize longest with "${1-0}" instead of just 
# "0"). 
max_tag_len() 
{ 
    local longest=0 name len 

    git for-each-ref --format='%(refname:short)' refs/tags | { 
     while read name; do 
      len=${#name} 
      [ $len -gt $longest ] && longest=$len 
     done 
     echo $longest 
    } 
} 

(Обратите внимание, что, в отличие от некоторых других случаев, нам не нужно слэш на refs/tags .. аргумент git for-each-ref Не то, что один на самом деле болеет здесь, это просто не нужно) Теперь мы можем сделать:

width=$(max_tag_len) 
git tag --format "%(align:1,$width)%(color:green)..." 

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

width=$(($(max_tag_len) + 1)) 

Используйте то, что, по вашему мнению, является самым ясным.

+0

Спасибо, это о том, чего я боялся;) Вы можете пропустить 'max_tag_len', используя уникальный разделитель, такой как' | ', а затем переходите к' column -ts '|' '. Хотя использование цветов кажется бесполезным, это немного ... –

+0

Одна из проблем, которые я заметил, - это использовать теги '{un,} аннотированные, и в этом случае вещи становятся действительно грязными. Особенно, если, просто для удовольствия, вы аннотируете тег аннотатного тега ... –