Git'teki mevcut şubedeki en son etiket adını nasıl alabilirim?


463

Git'te en son etiketi almanın en basit yolu nedir?

git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag

çıktı:

a
b
c

Her etiketin tarih saatini almak ve karşılaştırmak için bir komut dosyası yazmalı mıyım?


1
en son oluşturulan etiket veya taahhüt tarihine göre sıralanmış en son etiket? Kabul ettiğiniz yanıt, en son oluşturulan etiketi gösterir. Biri mevcut etiketleri değiştirmeye karar verirse bu bir sorun olabilir ...
Paebbels

Yanıtlar:


412

İstediğinize git describeyakın bir şey yapan bir göz atabilirsiniz .


194
Bununla --abbrev=0birlikte en yakın açıklamalı etiketi döndürmelidir
Jakub Narębski

13
Geçerli daldaki
brittohalloran

42
Almak için son açıklamalı etiketi hedefleyen yalnızca geçerli taahhüt de geçerli dalı , kullanımı git describe --exact-match --abbrev=0.
Naftuli Kay

5
Bu cevap, yorumlarla birlikte benim için doğru etiketi sağlamadı. @kilianic doğru çözümü verdi.
Herman J. Radtke III

21
git describe --tagsve com son etiketi github sürüm sayfasında karşılaştırın
Adriano Resende

628

En son etiketi almak için:

git describe --tags

En son açıklamalı etiketi almak için :

git describe --abbrev=0

2
Evet, adam sayfasının git describesöylediği gibi: --abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
Giorgos Kylafas

22
Veya sadecegit describe --tags
james_womack

5
Aynı taahhüdü işaret eden iki etiketiniz varsa bu yanıt (ve muhtemelen diğerleri) sorun çıkarır. Etiketler açıklamalı etiketler değilse, git için bu ikisinden hangisinin daha önce oluşturulduğunu ayırt etmenin bir yolu olmadığını düşünüyorum.
Paul Lynch

10
Bu kabul edilen cevap olmalı. Gönderdiğiniz için teşekkürler.
crmpicco

6
en son etiketi doğrudan kontrol etmek istiyorsanız:git checkout $(git describe --abbrev=0 --tags)
JohnRDOrazio

322

Tüm şubelerdeki en son etiketli taahhüdün etiketini çıktılar

git describe --tags $(git rev-list --tags --max-count=1)

8
veya TAG=$(git describe --tags $(git rev-list --tags --max-count=1))@ william-pursell
kilianc

20
Bu en iyi cevap. Aslında sadece geçerli dalda değil, geçerli "doğru" yanıtın yaptığı gibi tüm dallarda etiket alır.
brittohalloran

61
Sorunun dışında özellikle mevcut dalı soruyor.
michaeltwofish

3
@michaeltwofish, bilmiyordum, daha sonra anladım ve cevabımı düzelttim. Bunun için üzgünüm.
kilianc

3
Notlar: Bu komut, bu etiket başka bir dalda olsa bile "en yeni" etiketi döndürür.
Alan Zhiliang Feng

47

En son etiketi almak için şunları yapabilirsiniz:

$ git for-each-ref refs / tags --sort = -taggerdate --format = '% (refname)' - sayı = 1

Tabii ki, sayma bağımsız değişkenini veya sıralama alanını istediğiniz gibi değiştirebilirsiniz. Görünüşe göre biraz farklı bir soru sormak isteyebilirsiniz, ama bu soruyu yorumladığım gibi cevaplıyor.


2
Bu neredeyse tam olarak aradığım şeydi (tüm şubelerdeki en son etiket), ama en azından git (1.7.7.6) sürümümle etiketler hem --sort=-authordateve hem de aynı sırayla üretiliyor --sort=authordate.
larsks

3
Aha, çünkü aslında istediğin şey --sort=-taggerdate. Etiketler için authordateve committerdateboş (sıralama tuşları kadar işe yaramaz).
larsks

8
git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1daha da iyi :)
Christophe Eblé

5
Gerçekten, yorum yapmadan neredeyse 5 yaşında olan mükemmel bir doğru cevabı küçümsemek? Bu sadece kaba.
William Pursell

1
Ve --points-at=$SHAsize bir karma karması etiketi verecektir.
Ryan

35

Buna ne dersin?

TAG=$(git describe $(git rev-list --tags --max-count=1))

Teknik olarak, size mutlaka en son etiketi almaz, ancak aradığınız şey olabilir veya olmayabilir etiketli en son taahhüt.


Bu, geçerli daldaki en son etiketi değil, herhangi bir dal için alır. Bu harika, çünkü tam da ihtiyacım olan şey bu. Teşekkürler Wincent.
jasongregori

2
Eğer etiket eşleştirme kalıbını almak gerekiyorsa kullanabileceğiniz --tags=<pattern>içinde rev-list. Örneğin, son sürüm etiketini alıngit describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
Wirone

1
$ (git description --con $ $ (git rev-parse HEAD))
Vaidas Zilionis

Teşekkürler, işe yaradı, ama, --tag eklemek zorunda kaldım git describe --tags $(git rev-list --tags --max-count=1)
Gianluca Casati

25

Yürütebilirsiniz: git describe --tags $(git rev-list --tags --max-count=1)burada konuştuk: En son etiket adı nasıl alınır?


En üst / kabul edilen cevapla başladım ve aşağı doğru çalıştım. Bu aslında bana en son etiketi veren ilk cevaptır (neden emin değilim ama düz eski git describe ...bir önceki etiketi döndürür ?!)
Jeremy Davis

Benim için çalışan tek kişi bu. Bazı --abbrev=0cevapları denedim ve istediğim etiketin bir kısmını kesti.
Luke Davis

22

"En yeni" nin git anlamında iki anlamı olabilir.

"Hangi etiketin oluşturulma tarihi en geç zamanda vardır" anlamına gelebilir ve buradaki yanıtların çoğu bu soru içindir. Sorunuz açısından etiketi iade etmek istersiniz c.

Ya da "hangi etiketin geliştirme geçmişinde adlandırılmış bir şubeye en yakın olduğunu", genellikle bulunduğunuz dalı, yani HEAD. Sorunuzda bu, etiket döndürür a.

Bunlar elbette farklı olabilir:

A->B->C->D->E->F (HEAD)
       \     \
        \     X->Y->Z (v0.2)
         P->Q (v0.1)

Geliştirici tag'ed Imagine Zolarak v0.2Pazartesi günü, ardından tag'ed Qolarak v0.1Salı günü. v0.1daha yeni olmakla birlikte v0.2, kalkınma tarihinde HEAD'e daha yakındır, yani üzerinde bulunduğu yol HEAD'e daha yakın bir noktada başlar.

Bence bu ikinci cevabı genellikle geliştirme tarihinde daha yakından istiyorsunuz. Bunu git log v0.2..HEADher bir etiket için etc kullanarak bulabilirsiniz . Bu, HEAD v0.2tarafından izlenen yoldan sapan yoldan sonra HEAD üzerindeki taahhütlerin sayısını verir .

İşte bu kontrolü çalıştıran tüm etiketleri yineleyerek ve etiket yolu saptığından beri etiketi HEAD üzerinde en az işlem yaparak yazdıran bir Python betiği:

https://github.com/MacPython/terryfy/blob/master/git-closest-tag

git describeHEAD'den geçmişte bir yoldaki ilk etiketi bulmak için HEAD'den (örneğin) geri izlediği için biraz farklı bir şey yapar. Git terimleriyle, HEAD'den git describe"ulaşılabilir" etiketleri arar. Bu nedenle v0.2, HEAD'den geri yolda değil, oradan ayrılan bir yol gibi etiketler bulacaktır .


21

git describe --tags

geçerli dal tarafından görülebilen son etiketi döndürür


15
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed  's ......  '

SON BİR ETİKETTEN DAHA FAZLA İHTİYACINIZ VARSA

(git tarif --tags bazen yanlış hashes verir, neden bilmiyorum, ama benim için - max-count 2 çalışmıyor)

ters kronolojik sırayla en son 2 etiket isimleri ile liste bu şekilde alabilirsiniz, git 1.8.4 üzerinde mükemmel çalışır. Git'in önceki sürümleri için (1.7. * Gibi), çıktıda "tag:" dizesi yoktur - yalnızca son sed çağrısını silin

2'den fazla son etiket istiyorsanız - bu "sed 2q" yi "sed 5q" olarak veya neye ihtiyacınız varsa değiştirin

Daha sonra her etiket adını değişkene kolayca ayrıştırabilirsiniz.


bu gerçekten yararlıdır, birçok geliştirici dağıtım bozulursa önceki etikete geri dönerek yayın sürecini otomatikleştirmeye çalışır. Harika şey!!!
AkD

1
Bunu daha da ileriye götürmek için: git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p' burada %Dçevredeki ()karakterleri hariç tutar ve sedbaşlangıç ​​5q değeri 5'ten önce 4 satır bırakır, sonra 'tag: `ve ilk', arasındaki tüm karakterleri yazdırır. Yani ... etiketin içinde virgül kullanılmadığı varsayılarak, bu mükemmel çalışıyor.
Cometsong

14

Tüm önerilerinde yanlış olan ne ( Matthew Brett'in açıklaması dışında , bu cevap postasının bugüne kadar)?

Sadece jQuery Git geçmişine diğer tarafından sağlanan herhangi bir komutu çalıştırmak sizi de geçmiş farklı bakış ile ve onay sonucu görsel etiketleme geçmişi temsildid Eğer bu mesajı görüyorsanız yüzden):

$ git log --graph --all --decorate --oneline --simplify-by-decoration

Günümüzde birçok proje , ana şubeden ayrı dallarda sürümleri (ve böylece etiketlemeyi) gerçekleştirmektedir .

Bunun güçlü bir nedeni var . Sadece iyi kurulmuş JS / CSS projelerine bakın. Kullanıcı kuralları için DVCS'de ikili / simge durumuna getirilmiş sürüm dosyaları taşırlar. Doğal olarak proje koruyucusu olarak, ana hattınızın farklı geçmişini işe yaramaz ikili bloblarla çöpe atmak ve ana hattan yapı yapılarının taahhüdünü gerçekleştirmek istemezsiniz .

Git doğrusal geçmişi değil DAG kullandığından - mesafe metriğini tanımlamak zordur, bu yüzden şunu söyleyebiliriz - oh bu devir benim en yakınım HEAD!

Kendi yolculuğuma başladım (içine bakın, bu uzun yazıya süslü resimler kopyalamadım):

Git'te dallanma konusunda geçmişte en yakın etiket hangisidir?

Şu anda yararlılığı azaltarak etiket ve revizyon arasındaki mesafenin 4 makul tanımı var:

  • En kısa yol uzunluğu ile ilgili HEADiçin birleştirme baz etiketiyle
  • tarih içinde birleştirme tabanı arasındaki HEADve etiket
  • HEAD'den erişilebilen ancak etiketten erişilemeyen devir sayısı
  • birleştirme tabanına bakılmaksızın etiket tarihi

En kısa yolun uzunluğunu nasıl hesaplayacağımı bilmiyorum .

Etiketleri , ve tag arasındaki birleştirme tabanı tarihine göre sıralayan komut dosyası :HEAD

$ git tag \
     | while read t; do \
         b=`git merge-base HEAD $t`; \
         echo `git log -n 1 $b --format=%ai` $t; \
       done | sort

Çoğu projede kullanılabilir.

Etiketleri HEAD'den erişilebilen ancak etiketten erişilemeyen devir sayısına göre sıralayan komut dosyası :

$ git tag \
    | while read t; do echo `git rev-list --count $t..HEAD` $t; done \
    | sort -n

Proje geçmişinizin taahhütlerde garip tarihleri ​​varsa (yeniden basmalar veya başka bir tarih yeniden yazımı veya bazı moronlar nedeniyle BIOS pilini veya tarihte yaptığınız diğer büyüleri değiştirmeyi unutmayın) yukarıdaki komut dosyasını kullanın.

Son seçenek için ( birleştirme tabanına bakılmaksızın etiketin tarihi ) tarihe göre sıralanmış etiketlerin listesini almak için:

$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r

Geçerli düzeltme tarihini öğrenmek için şunu kullanın:

$ git log --max-count=1

git describe --tagsKendi durumlarında kullanımı olan ancak proje tarihinde insanın beklediği en yakın etiketi bulmak için kullanılmadığını unutmayın .

NOT Herhangi bir revizyonda yukarıdaki tarifleri kullanabilirsiniz, sadece HEADistediğiniz ile değiştirin !


12

git describe --abbrev=0 --tags

En son etiketi görmüyorsanız, çalıştırmadan önce başlangıç ​​noktasını aldığınızdan emin olun:

git remote update


12
git tag -l ac* | tail -n1

Son etiketi "ac" önekiyle al . Örneğin ac1.0.0, veya ile adlandırılmış etiket ac1.0.5. Adlı Diğer etiketler 1.0.0, 1.1.0göz ardı edilecektir.

git tag -l [0-9].* | tail -n1

İlk karakteri olan son etiketi alın 0-9. Bu nedenle, ilk karakterli etiketler a-zdikkate alınmaz.

Daha fazla bilgi

git tag --help # Help for `git tag`

git tag -l <pattern>

Verilen kalıpla eşleşen adlara sahip etiketleri (veya kalıp verilmemişse tümünü) listeleyin. "Git tag" ifadesini bağımsız değişkenler olmadan çalıştırmak tüm etiketleri listeler. Desen bir kabuk joker karakteridir (yani fnmatch (3) kullanılarak eşleştirilir). Birden çok desen verilebilir; bunlardan herhangi biri eşleşirse, etiket gösterilir.


tail -n <number> # display the last part of a file
tail -n1 # Display the last item 

Güncelleme

İle git tag --help, sorttartışma hakkında. Özellik yoksa lexicorgraphic ordervarsayılan olarak kullanılır tag.sort.

Sıralama düzeni varsayılanları, varsa tag.sort değişkeni için yapılandırılmış değere, aksi halde sözlükbilimsel düzene göre sıralanır. Bkz. Git-config (1).

Google'dan sonra, birisi sözdizimini takiben git 2.8.0 desteği dedi .

git tag --sort=committerdate

onun için wok değil, son etiketi 2.11.174 ama bu baskı 2.11.99 çünkü sürüm olarak sıralamayın
Ali.MD

8
git tag --sort=committerdate | tail -1

Lütfen bu kod snippet'inin yalnızca kod yanıtı göndermek yerine sorunu nasıl çözeceğini açıklayın.
Arun Vinoth

5

Son iki etikete ihtiyacınız olduğunda (örneğin, geçerli etiket ile önceki etiket arasında değişiklik günlüğü oluşturmak için) aşağıdakiler benim için çalışır. Sadece son etiketin olduğu durumda test ettim HEAD.

PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`

GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`

Benim ihtiyaçlarıma uygun, ama git sihirbazı olmadığım için daha da geliştirilebileceğinden eminim. Ayrıca, taahhüt tarihinin ilerlemesi durumunda kırılacağından şüpheleniyorum. Sadece birine yardım etmesi durumunda paylaşıyorum.


4

İlk düşüncem, git rev-list HEADtüm devirleri ters kronolojik sırayla listeleyen, kullanabileceğiniz git tag --contains. git tag --containsBoş olmayan bir liste oluşturan bir ref bulduğunuzda, en son etiketleri buldunuz.


4

Belirli bir dalda uygulanan son etiketi bulmak istiyorsanız aşağıdakileri deneyebilirsiniz:

git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")

3

Geçerli dalda en son etiket adını (etiket tarihine göre) alan bir astara ihtiyacınız varsa :

git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD

Kurulumda sürüm numarasını ayarlamak için bunu kullanırız.

Çıktı örneği:

v1.0.0

Windows üzerinde de çalışır.


1
Linux'ta (Debian Stretch) alıyorum-bash: syntax error near unexpected token '('
Jeremy Davis

1
Eğer o parçayı tırnak içine alırsam (yani --format="%(refname:short)") ve atlayarak --points-at=HEADçalışır. Bu son anahtarla hiçbir şey döndürmez, sanırım benim HEADetiketli değil mi?
Jeremy Davis

@ JererDavis, evet sanırım bunun nedeni HEADetiketlenmemiş olması.
Markus

2

Bu eski bir iş parçacığıdır, ancak birçok insan OP'nin sorusuna en basit, en kolay ve en doğru cevabı kaçırıyor gibi görünüyor: mevcut dal için en son etiketi almak için kullanıyorsunuz git describe HEAD. Bitti.

Düzenleme: Ayrıca herhangi bir geçerli refname, hatta uzaktan kumanda sağlayabilirsiniz; yani, git describe origin/masterorijin / master'dan ulaşılabilecek en son etiketi söyleyecektir.


Hiçbir şey "en son etiketin" herhangi bir şube tarafından ele alınacağını garanti etmez. İki çalışma çözümü for-each-ref( stackoverflow.com/a/5261470/515973 ) komutu ve rev-listve describe( stackoverflow.com/a/7979255/515973 )
Julien Carsique

1
Bu benim için en son etiketi almıyor.
K - SO'da toksisite artıyor.

git describe branchname --tagsbenim için en son etiketi almak için çalışıyor (git sürüm 2.12.2)
Rob_M

0

En son etiketi yalnızca geçerli dalda önek bulunan geçerli dalda / etiket adında almak için aşağıdakileri yürütmek zorunda kaldım

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH

Şube yöneticisi:

git checkout master

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

master-1448

Şube özel:

git checkout 9.4

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

9.4-6

Ve son ihtiyacım olan sonraki etiketleme için +1 etiketini artırmam ve almam gerekiyor.

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags  --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'

0

Sorulduğu gibi,

Geçerli dalda en son etiket adı nasıl alınır?

İstediğiniz

git log --first-parent --pretty=%d | grep -m1 tag:

--first-parentgit logherhangi bir birleştirilmiş tarihin detaylandırılmamasını söyler , --pretty=%dsadece süslemeler, yani herhangi bir taahhüt için yerel isimler göstermeyi söyler. grep -m1"yalnızca bir tanesiyle eşleştir" der, böylece en son etiketi alırsınız.


0

etiketleriniz sıralanabilirse:

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1

0

Açıklamalı etiketlere ve açıklamalı etiketlere burada çok fazla değinilmiyor. 'tanımla' açıklamalı etiketler üzerinde çalışır ve açıklanmamış etiketleri yok sayar.

Bu çirkin ama istenen iş yok ve diğer dallarda hiçbir etiket bulamayacak (komutta belirtilen etikette değil: aşağıdaki örnekte master)

Filtreleme optimize edilmelidir (konsolide), ama yine, bu iş gibi görünüyor.

git log  --decorate --tags master |grep '^commit'|grep 'tag:.*)$'|awk '{print $NF}'|sed 's/)$//'|head -n 1

Şimdi kullanmak için koyacağım gibi kriterler hoş geldiniz :)


-2

Almak için diğer basit yolu son etiket adını ile

git tag | tail -1

veya

TAG=$(git tag | tail -1)

bir değişkende saklamak için.

git tagtüm mevcut etiketleri listeler ve sonuç ise son satırı döndürür.tail-1


4
Sıralama olmadan bu kötü bir hamle.
mjd2
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.