В достаточно современной 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))
Используйте то, что, по вашему мнению, является самым ясным.
Спасибо, это о том, чего я боялся;) Вы можете пропустить 'max_tag_len', используя уникальный разделитель, такой как' | ', а затем переходите к' column -ts '|' '. Хотя использование цветов кажется бесполезным, это немного ... –
Одна из проблем, которые я заметил, - это использовать теги '{un,} аннотированные, и в этом случае вещи становятся действительно грязными. Особенно, если, просто для удовольствия, вы аннотируете тег аннотатного тега ... –