Git'te hangi etiketin taahhüt edildiğini nasıl anlarım?


410

Depodaki bir grup açıklanmamış etiketler var ve hangi taahhüt ettiklerini belirtmek istiyorum. Yalnızca etiketleri ve bunların taahhütlü SHA'larını listeleyecek bir komut var mı? Etiketi kontrol etmek ve HEAD'a bakmak benim için biraz zahmetli görünüyor.

Güncelleme

Yanıtları inceledikten sonra aslında istediğim şeyin etikete giden tarihe bakmak olduğunu ve bunun git log <tagname>için yeterli olduğunu fark ettim .

Yanıt olarak işaretlenen cevap, etiketlerin ve bunların taahhütlerinin bir listesini almak için kullanışlıdır, bu da sordum. Biraz kabuk hackery ile eminim ki bunları SHA + Tamamlama mesajına dönüştürmek mümkün.


3
git show-refRepo revizyonunun değil, etiketin sha'ını gösteren noktaya işaret etmek istiyorum . $ git show-ref testi 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 refs / tags / test $ git ödeme testi HEAD şimdi c7f8831'de ... $ git checkout 08b9c77 HEAD şimdi c7f8831'de ...
Konstantin Pelepelin

etiketlerinize açıklama eklenmişse ihtiyacınız vardır--dereference
Trevor Boyd Smith

Yanıtlar:


347

Bunu yapmanın bir yolu olurdu git rev-list. Aşağıdakiler, bir etiketin işaret ettiği taahhüdü verir:

$ git rev-list -n 1 $TAG

~/.gitconfigÇok kullanırsanız , takma ad olarak ekleyebilirsiniz :

[alias]
  tagcommit = rev-list -n 1

Ve sonra şunu arayın:

$ git tagcommit $TAG

30
Neden kullanmıyorsunuz git rev-parse <tag>? Yoksa git rev-list -1 <tag>?
Jakub Narębski

51
@ Jakub: git rev-parse $TAGişaret ettiği taahhüdü değil, etiket nesnesinin SHA1'ini döndürür. git rev-list -1Yine de çalışıyor.
mipadi

11
@mipadi: Ek açıklamalı etiketler için önemli değil; açıklamalı etiketler için açıklamalı / imzalı etiketi kullanabileceğiniz git rev-parse $TAG^{commit}veya git rev-parse $TAG^{}bu etiketi iptal etmek için kullanabilirsiniz
Jakub Narębski

5
Şunları kullanabilirsiniz:git rev-list $TAG --max-count=1
b73

4
@RobinHsu: Ek açıklama eklenmiş etiketleriniz varsa git tag -aveya ile oluşturulmuşsa git tag -s, o git rev-parse <tag>zaman size bir etiket nesnesinin SHA- 1'ini verirken git rev-list -1 <tag>, işaret ettiği taahhüt (düzeltme) SHA- 1'ini verir git rev-parse <tag>^{commit}. HTH.
Jakub Narębski

240
git show-ref --tags

Örneğin, git show-ref --abbrev=7 --tagssize aşağıdakine benzer bir şey gösterecektir:

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2

Bunun için teşekkürler, bu aslında ikisinden birine bakmanın anlambilimini gizler .git/packed-refsveya.git/refs/tags/*
Igor Zevaka

3
hmmm. depomda garip bir davranış var: git tag -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref - etiketler -> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; Jakub Narebski'nin cevabına bakın
NickSoft

6
Bu da işe yarıyor, ama ben git tag --verbosede onlara göstermenin mantıklı olmadığını merak ediyorum.
nonopolarite

34
Bu, etiketin işaret ettiği taahhüdü değil, etiketin ref'sini gösterir. -dReferans verilen taahhüdü almak için bayrağı eklemeniz gerekir (ikinci bir satırda).
Eski Profesyonel

4
@CharlesBailey, yeterince adil, ancak soru ve cevaplar açıklamalı etiketler içerecek şekilde değişti git show-refve iki farklı etiket türünde farklı davranması gerçeği açık veya ortak bir bilgi değil.
Old Pro

104

Sadece kullan git show <tag>

Ancak, aynı zamanda taahhüt farkları dökümü. Bu farkları atlamak için kullanın git log -1 <tag>. (@DolphinDream ve @demisx sayesinde!)


7
SO'da, bir sorunun birçok farklı olası cevabı olduğunda, önce gönderilen cevaplar önce değerlendirilir - bunları listenin en üstüne koyar ve daha sonra daha fazla oy alır. Bu, yanıt kalitesine göre yanıt hızına dayalı bir önyargı geri besleme halkasıdır. Yeterli hayal gücü ile bu sorun giderilebilir.
samthebest

6
Ne için "en iyi çözüm"? Eğer ilgi bir taahhüdün SHA'sını bulmaksa etiket "git show <mytag>" 'a işaret eder en iyi çözüm DEĞİLDİR. Bu komut, taahhüdün getirdiği tüm farkı gösterir. Taahhüdün yalnızca SHA'sını listelemek için etiket "git rev-list <mytag> -n 1" 'i işaret eder doğru çözümdür.
DolphinDream

Bu OP'nin sorusunun cevabı değil. git show <tag>etiketin işaret ettiği taahhüdü değil, farkı gösterir.
demisx

@demisx Neden bahsediyorsun ?? Etiketleme, tarih ve diğer bilgilerle birlikte kesin karmayı gösterir. Dene.
Hlung

4
@DolphinDream'in işaret ettiği gibi git show, ekranda olması gerekmeyen çok daha fazla şeyi ekrana döküyor. Aradığı fiili taahhüt karmasını gizler. Daha iyi bir komut git log -1 [tag-name]ya git log -1 --pretty=oneline [tag-name]da oneliners istiyorsanız.
demisx

40

Depomda, git show-ref TAGişaret ettiği taahhüdün karma değerini değil, etiketin karma değerini gösterir.

git show-ref --dereference TAG ek olarak, taahhütte bulunulmasını da gösterir.


34

Gönderen Igor Zevaka :

özet

Neredeyse eşit derecede kabul edilebilir yaklaşık 4 farklı cevap olduğundan, bir etiketi kaplamanın tüm farklı yollarını özetleyeceğim.

  1. git rev-list -1 $TAG( cevap ). git rev-listTaahhüdün SHA1'ine $TAGbenzeyen git logancak sadece SHA1'i gösteren taahhütleri çıktılar . -1Bu işaret işlemek için çıkışını sınırlar.

  2. git show-ref --tags( answer ) tüm etiketleri (yerel ve uzaktan alınan) ve SHA1'lerini gösterir.

  3. git show-ref $TAG( answer ) etiketi ve SHA1 ile birlikte yolunu gösterir.

  4. git rev-parse $TAG( yanıt ), açıklanmamış bir etiketin SHA1'ini gösterecektir.

  5. git rev-parse --verify $TAG^{commit}( yanıt ) hem açıklamalı hem de açıklanmamış etiketlerin SHA1'ini gösterecektir. Windows'da git rev-parse --verify %TAG%^^^^{commit}(dört şapka) kullanın .

  6. cat .git/refs/tags/*veya cat .git/packed-refs( cevap ) etiketin yerel olup olmamasına veya uzaktan kumandadan alınmasına bağlı olarak.


33

kullanım

git rev-parse --verify <tag>^{commit}

(açıklamalı etiket için bile bir taahhüdün SHA-1 değerini döndürür).


git show-ref <tag><tag>açıklamalı değilse de çalışır . Ve her zaman vardır git for-each-ref(ayrıntılar için belgelere bakın).


11
git rev-parse <tag>~0Hangisinin de işe yaradığını ve Windows'ta özel bir kaçış gerektirmediğini tercih ediyorum (bir yerine dört şapka (^) gerekli). Sonek ~<number><sayı> cnci ana taahhüdü ~0verir , bu nedenle taahhüdün kendisini verir. Btw, ^0ayrıca ^{commit}revizyon soneki için geçerli bir stenondur .
Attila

15

Buna ne dersin:

git log -1 $TAGNAME

VEYA

git log -1 origin/$TAGNAME

10

Bir etiketin başvurduğu taahhüdün sha / hash değerini elde etmek için (etiketin sha değil):

git rev-list -1 <tag>


8

Ben de "doğru" yolu bilmek istiyorum, ama bu arada, bunu yapabilirsiniz:

git show mytag | head -1    

git show --oneline mytag | head -1
Taahhüt

7

Bu oldukça eski olmasına rağmen, etiketleri yalnızca taahhütlerle listelemek için bulduğum harika bir özelliği işaret edeceğimi düşündüm:

git log --decorate=full

Bir taahhütte sona eren / başlayan dalları ve taahhütler için etiketleri gösterecektir.


4

Ayrıca etiketlerin nerede kullanıldığının daha kolay yorumlanabilir bir resmini elde edebilirsiniz

git log --graph |git name-rev --stdin --tags |less

ve ardından aradığınız etikete gidin / .

Daha kompakt görünüm ( --pretty=oneline) ve tüm kafalar ( -a) da yardımcı olabilir:

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

Biraz korkunç görünüyor, ancak ~/.gitconfiggerekirse takma ad da olabilir .

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

4

Git-2 sonrası kısa cevap

Bu sorunun bir süredir burada olduğunu biliyorum. Ve CB Bailey'in cevabı% 100 doğrudur:git show-ref --tags --abbrev

Kullandığı için bu daha iyi git tag:

git tag --list --format '%(refname:short) %(objectname:short)'

Basit. Kısa.

PS git taglistbu komutla olduğu gibi diğer adı :

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"

3

Gönderen git posta listesi , burada açıklamalı etiketleri için otomatik dereferencing ile etiketler için karmaları taahhüt listesini almak için yoludur:

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

2

Bu, dosya adlarını göstermez, ancak en azından depo hakkında bir fikir edinirsiniz.

cat .git/refs/tags/*

Bu dizindeki her dosya bir taahhüdü gösteren bir taahhüt SHA'sı içerir.


Sanırım etiketleri uzaktan kumandadan aldım. .git/packed-refsolsa işe yaradı.
Igor Zevaka

2

ben de doğru yolu bilmek istiyorum , ama her zaman içine bakmak olabilir:

$ cat .git/packed-refs 

veya:

$ cat .git/refs/tags/*

Doğru, paketlenmiş refs ve refs / etiketleri için davranış biraz farklıdır, paketlenmiş refs etiketleri ve SHA'ları içeren bir metin dosyasıdır, refs / tags / ise SHA'yı içeren bir etiketin adını taşıyan metin dosyaları olan bir dizindir. Aslında bunu yapmanın doğru yolunun olduğunu düşünüyorum git rev-list.
Igor Zevaka

2

Bu size mevcut SHA1 karmasını verecektir

Kısaltılmış İşlem Karması

git show <tag> --format="%h" --> 42e646e

Karma Yap

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280

1
Ben sürümde çalışması gibi görünüyor, ama değil git log <tag> -n 1 --pretty=%Hdoes
Andy

2

SOMETAG (tagger, tarih vb.) Etiketinin ayrıntılarını görmek istiyorsanız, işaret ettiği taahhüdün karması ve taahhüt hakkında biraz bilgi ama tam fark olmadan deneyin

git show --name-status SOMETAG

Örnek çıktı:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....

0

Bu nedenle, bu klasörlerin birkaç farklı depodan birinden teslim alınabileceği ve dev, qa veya ana dallar olabileceği veya üretim sürümleri olabileceği, bir etiketten teslim alınabileceği ve etiketin açıklamalı veya açıklamalı. Hedef klasöre bakmak ve geri formunda bir cevap - olacak bir komut dosyası var. Sorun, git'in farklı sürümlerinin farklı bir durum döndürmesi.

Bu yüzden git show-ref --tagsek açıklama eklenmiş etiketler dışında başlangıçta işe yaradığını buldum . Ancak -d eklenmesi etiket listesine, biri etiket için diğeri ek açıklama için ayrı bir giriş ekledi (ek açıklama kesinleştirmesi sed ile çıkardığım ^ {} olarak tanımlandı).

Bu benim senaryomun çekirdeği, isteyen herkes için: -

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi

0

Aşağıda kullanabilir, taahhüt karma verecektir
git show -s --format=%H <tag>^{commit}

Kısaltılmış tamamlama karması gerekiyorsa, git show -s --format=%h <tag>^{commit}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.