Вывести список тегов с коммитами в том же формате, что и git branch -v - PullRequest
1 голос
/ 03 апреля 2011

Привет, я хотел бы перечислить теги , как это указано в:

# git branch -v
* devel  e7f5e36 firxed bugs
  master 63e9c56 remove unused code

без * (вы не можете оформить заказ).

Было быхорошо иметь возможность перечислять полный или короткий SHA1.Сценарий bash также хорош, но было бы неплохо использовать команды git больше и меньше сценариев оболочки.

Я читал этот вопрос Как узнать, на какой коммит указывает тег в Git? и это помогло мне, но это не все, чего я хочу.

Редактировать:

Я не знал, что у аннотированных тегов был SHA1.Я хотел SHA1 коммитов, на которые указывает тег, а не сами теги.

Ответы [ 3 ]

3 голосов
/ 03 апреля 2011

Обновление Удалены старые вещи, обновление с форматированием

Простейший мерзавистый фарфор способ получить максимум информации:

git show-ref --tags --abbrev

(потеря --abbrev для полного ша1)

Полные свистки:

git for-each-ref --format="%(refname) %(objectname) %(subject)" |
      grep /tags/ |
      sed 's#^refs/tags/##'

Типичный вывод:

tag1 b93d2f5e5ad52b8abbee9f5ca8435a1d271ddbb6 test
tag2 b93d2f5e5ad52b8abbee9f5ca8435a1d271ddbb6 test
tag3 58b05fd27be9484bf981752e89843bee7aff8860 test2
tag4 b1be7e4de8949b7ba515e4cad5d214dc71d9b6d2 annotated
tag5 779528366646eeef1d87d30fa3d76c70d0493dff and signed

Чтобы клонировать мой тестрепо:

base64 -d <<HERE > /tmp/so5529735.bundle
IyB2MiBnaXQgYnVuZGxlCjU4YjA1ZmQyN2JlOTQ4NGJmOTgxNzUyZTg5ODQzYmVlN2FmZjg4NjAg
cmVmcy9yZW1vdGVzL3EvbWFzdGVyCmI5M2QyZjVlNWFkNTJiOGFiYmVlOWY1Y2E4NDM1YTFkMjcx
ZGRiYjYgcmVmcy90YWdzL3RhZzEKYjkzZDJmNWU1YWQ1MmI4YWJiZWU5ZjVjYTg0MzVhMWQyNzFk
ZGJiNiByZWZzL3RhZ3MvdGFnMgo1OGIwNWZkMjdiZTk0ODRiZjk4MTc1MmU4OTg0M2JlZTdhZmY4
ODYwIHJlZnMvdGFncy90YWczCmIxYmU3ZTRkZTg5NDliN2JhNTE1ZTRjYWQ1ZDIxNGRjNzFkOWI2
ZDIgcmVmcy90YWdzL3RhZzQKNzc5NTI4MzY2NjQ2ZWVlZjFkODdkMzBmYTNkNzZjNzBkMDQ5M2Rm
ZiByZWZzL3RhZ3MvdGFnNQoKUEFDSwAAAAIAAAAFkA14nJXLTQrCMBBA4X1Okb1QkslPJyDiHTzB
TDKhom0lHe+vHsHl4+PpELGREVKrOULlLFzIZScpcseWCyB2FonFRfOiIZtaLqFBT5KoJWAk/nrp
qRLGkMg3mH1rzNnQW5d92JvoYs+HLHJdRcaDdPrFtD0v1gfnMXossz05cM7UfV3vqvLnZlQOBfMB
6ao+qP0BWLBf0nvpSEv5gXUuiYQ77nr/iGB4nLvAOJ9xgt7EOB1Gg4ndZnwGCtoGRgYGXFwlqcUl
XACDHwf3zyZ4nG2RyY6bQABE73wFx0RWzD5AlInSDBgwpt1gFsONpVlss8huYPDXz0xyTUklVdWt
9Ib8ggtCS0rOSlXJyzlWRUXMK1XhZInHiqqIQo6xnFWVorywFFlHTBdD17WEIllNf1r6CjW+0ydM
GvrXAzf4T4fx/ZqR7VfZ9rffNCewnCKKLKfSG5ZnWYrK+pJ+tHWPS+rHlzTDtCGNTESfbBOCIPSN
vzsV4fujHfqftNlPyKRnbituOZb+ZsKQObT99P6dolrPKDQANFADU/P2sNsDAYBhbyDi9rLjg2aN
dBxazMV4tqUjxTu0DBvyMEZ3SMPhSElwPHm7BCfMxAt9eucFPdfWYbWy+Sx7ADW924SDbBYEaZIo
vncvnhlEzAqZdOIP6UwdiyjLVOFZx7qdPyopjgR9dVamBG+pn3zevzZJvp/LwkJ6EPHzYFku6f2z
e5sbwVE96q7dKnfX+D5iSX4ictT6S9TZyN70kO3iBTnLyX9qMIxP0hzrI1TNxbkTG10DhXBaTuXJ
beP6R/WZqLA5X4EWJ1HtgH6elrmU7d07M7pjnF4OTh2LTbCZF99FjHpA8lmrFWeiAAzS8+oYmfWm
r4XUypdQzNZ0nRrleXzaFmzbvjimpCNGgJB2NMcODkDprpVZXiLvlXp1kWf9o2lA/X8sPwAX3sJy
8gJ3lSg2Zkbu7x2H0w+j12xw0Ek9/3ice8/SwjjBmdFkoouWmLGlkamCtoGRgQEXV2JeXn5JYklq
ChcAos4JUiB4nAMAAAAAATDs5z1PX9htU9L79152rIjAVSvV
HERE

git clone --mirror /tmp/so5529735.bundle /tmp/so5529735.git

Ура

2 голосов
/ 04 апреля 2011

Результат версии sehe:

# git for-each-ref --format="%(refname) %(objectname) %(subject)" \
  | grep /tags/ |       sed 's#^refs/tags/##'
initial a9dcc1f24cacde535523bddc22f4c69467428550 initial commit
v0.1.1-alpha b784145a9a71478337f5ceae30aaac4e1b955ee5 initial version. big chance to work. not quite tested
v0.1.2-alpha 193993aabb0c3634ebea0405ecd420e99c609422 it is still alpha
v0.1.3-alpha 415fb8f25982233b1b1211d8500e923e40ce64fd works better. not tested in details.

результат версии sehe с коротким выводом (например, вывод по умолчанию git branch -v):

# git for-each-ref --format="%(refname) %(objectname:short) %(subject)" \
   | grep /tags/ |       sed 's#^refs/tags/##'
initial a9dcc1f initial commit
v0.1.1-alpha b784145 initial version. big chance to work. not quite tested
v0.1.2-alpha 193993a it is still alpha
v0.1.3-alpha 415fb8f works better. not tested in details.

Результат моей версии:

initial      a9dcc1f initial commit
v0.1.1-alpha a9dcc1f initial version. big chance to work. not quite tested
v0.1.2-alpha 8dd326d it is still alpha
v0.1.3-alpha 54d7ccd works better. not tested in details.

Здесь начальный - это легкий тег

Разница:

  1. (самый важный) Первый столбец автоматически дополняется до самой большой длины тега - этоболее читабельный
  2. SHA1 имеет фиксацию, на которую указывает тег, даже если это не легкий тег .Таким образом, вы можете легко увидеть, что initial указывает на тот же коммит, что и v0.1.1-alpha .Такое поведение легко можно сделать необязательным.

Мой сценарий слишком длинный.Я выложу только функцию вызова git (скрипт bash).Большинство из них взято со справочной страницы git-for-each-ref:

function gitTags(){
  arg="$1"
  REF=${arg:-"*"}
  fmt='
    r=%(refname)
    t=%(*objecttype)
    T=${r#refs/tags/}
    o=%(*objectname:short)
    s=%(subject)
    kind="T"
    if [ "$t" = "" ] ; then
      # could be a lightweight tag
      t=%(objecttype)
      kind="L"
      o=%(objectname:short)
    fi
    len=${#T}
    if [ "$len" -gt ${len1:-0} ]; then
      len1=$len
    fi

    echo -e "$T\t$o\t$s"
  '
  eval=`git for-each-ref --shell --format="$fmt" \
          --sort='*objecttype' --sort=taggerdate "refs/tags/$REF"`

  out=`eval "$eval"'echo $len1;'`
  local len1=`echo "$out"|tail -n 1`

  echo "$out"|head -n -1 \
     |awk 'BEGIN{FS="\t"}{printf("%-'$len1's %s %s\n", $1, $2, $3)}'

}

использование:

#show all tags:
gitTags
#show all tags starting with v (v1.0)
gitTags v*
1 голос
/ 22 октября 2012

ОП сказал, что хочет SHA1 коммита, на который указывают теги. Приведенные выше решения, предложенные sehe и NickSoft, не дают SHA1 коммита, когда тег является аннотированным тегом. Вместо этого они дают SHA1 объекта аннотации, на который указывает. (Объект аннотации указывает на фиксацию.)

Если вы хотите перечислить каждый тег и SHA1 коммита, то вы можете просто выполнить:

    git log --tags --oneline --decorate=short

К сожалению, это не даст вам формат, похожий на

    git branch -v

Но вы можете подойти довольно близко, выполнив:

    git for-each-ref --format="%(refname:short)" refs/tags | 
    awk '{printf "%s ",$1; system("git rev-list --max-count=1 "$1)}'

Обратите внимание, что git rev-list даст вам SHA1 коммита, а git show-ref и git for-each-ref только SHA1 объекта, на который указывает (что в случае аннотированного тега объект аннотации не коммит).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...