Belirli bir git commit ile ilişkili etiketi nasıl bulabilirim?


90

Sürümler için genellikle v1.1.0 gibi bir şeyle etiketlerim. Derleme betiğim sırasında, geçerli git bilgisini içeren bir fwVersion.c dosyası oluşturuyorum. Şu anda dosyada commit ve şube bilgilerim var, ancak etiketi eklemek istiyorum.

Mümkün mü?

Yanıtlar:


115

İle ilgili belgeleri kontrol edin git describe. Belirli bir işlemeye en yakın etiketi bulur (bu, commit'in bir atasına işaret eden bir etikettir) ve bu kaydı etiket açısından açıklar.

Yalnızca kaydetmenin bir etiketle işaret edilip edilmediğini bilmek istiyorsanız, şu çıktıyı kontrol edebilirsiniz:

git describe --exact-match <commit-id>

32
git describe --tags <commit-id>açıklama yapılmamış etiketler için
Aleksandr

1
Bunu seviyorum. Spefically, mevcut revizyondan bir insan tarafından okunabilir hale getirebilmeyi seviyorum:git describe --all --exact-match `git rev-parse HEAD`
dsummersl

5
Daha yeni sürümlerde, git describe --tags --abbrev=0 REVetiketin üzerinde çöp olmasını istemediğinizde yararlı olacaktır.
Craig Ringer

1
git describe --all(şu anda kontrol edilen taahhüt için) veya git describe --all <commit>her zaman istediğim her şeyi yaptım.
rfay

Git sürümlerini kullanmanın en iyi yanı, bir yazılım devreye alındığında sürümün kaynakta kodlanması olmamasıdır. Git tarifinin en yakın etiketi bulma yolu, sonraki sürüm numarasını hesaplamak ve depoya ve paket adına bir etiket ref eklemek için kullanılabilir.
Sid

64

İstediğiniz, yürütmeyi içeren ilk etiketse, o zaman:

git describe --contains <commit>

en iyi cevabı verir IMO. Büyük bir depodaki eski bir commit üzerinde "git tag --içerir" kullanmaktan daha sık etiketlere sahipseniz, çalışması biraz zaman alabilir ve size bu commit'i içeren tüm etiketleri verir.

Bu git description biçimi çok hızlı çalışır ve size commit'i içeren ilk etiket olan ve commit'inizin ne kadar geriye gittiği tek bir çıktı değeri verir.


27

Buna ne dersin?

git tag --points-at <commit-id>

Size verilen işlemenin sahip olduğu tüm etiketleri git describeverir (ancak size yalnızca bir tane verir) ve alt kayıtlardaki etiketleri git tag --containsiçermez (yaptığı gibi ).


Bunu beğendim çünkü stderr'e hiçbir hata mesajı yazılmaz. Teşekkürler.
Basuke

23

Bu bilgileri kılavuzda bulabilirsiniz

git tag --contains <commit>

3
Bu, verilen commit'i içeren tüm etiketleri listeleyecektir (yani, verilen commit'in alt öğelerine işaret eden etiketler), bu nedenle, belirli bir commit için tek bir etiket veya hangi etiketin en yakın olduğu hakkında herhangi bir bilgi vermesi gerekmez. liste yalnızca tek bir kaydetme içerir.
CB Bailey

4
Charles Bailey'nin yukarıda söylediği gibi, tam olarak aradığım şey bu değil. Belki RTFM yapmalısınız :)
wes

1
Yanlış cevap için özür dilerim. Kontrol ettiğimde, istediğin şeyi yapıyor gibiydi. RTFM yaptım, sadece yanlış problemi çözüyordum. Umarım Bailey size yardımcı olacak bir çözüm önermiştir.
dharga

6
SO'da git sorusu sormadan önce git kılavuzunun tamamını okumanıza gerek yok, değil mi? google indeksleri herhangi bir git man sayfasından ÇOK daha iyi ...
aaronstacy

13

Bana istediğimi vermek için iki en iyi cevabın kombinasyonunu buldum:

git describe --tags --exact-match <commit-id>

Bu size YALNIZCA bu işlem için ve ek açıklamasız olanlar için olan etiketi verir. Etiketleri bulmak istediğinizde ve biçimlendirmeyi çıkarmak için endişelenmediğinizde kullanışlıdır (örneğin Jenkins için).

Örneğin. $ git describe --tags --exact-match head~2

Sana verir:

$ ReleaseBeta

0

Bazı cevapları birleştirmek:

git tag --contains [<ref>]

ve

git tag --points-at [<ref>]

ya da sadece

git tag

aynı şekilde davranır, belirtilen ref için herhangi bir (ve tüm) etiketleri veya belirtilmemişse geçerli kaydetmeyi yazdırır.

git describe --tags [<ref>]

burada <ref>varsayılan olarak geçerli kaydetme, kaydetmeyle ilişkili hiçbir etiket yoksa 128 ile çıkar ve kaydetmeyle ilişkili bir etiketi yazdırır (bir kalıp yok gibi).

git describe [<ref>]--tagsyalnızca açıklamalı etiketleri yazdırması dışında olduğu gibi davranır .

Seçeneğinin --containssağlanması describe, belirtilen kaydetmenin bir atası ile ilişkili bir etiketi yazdırır. Örneğin

$ git init
Initialized empty Git repository in /tmp/test
$ git commit -m one --allow-empty
[master (root-commit) 7fdfff2] one
$ git commit -m two --allow-empty
[master cd5f8f1] two
$ git tag -am foo foo
$ git tag bar
$ git log --format=oneline
cd5f8f1f4f29eb164f83e224768ccaf37fe170ed (HEAD -> master, tag: foo, tag: bar) two
7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1 one
$ git describe 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
fatal: No tags can describe '7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1'.
Try --always, or create some tags.
$ git describe --contains 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
bar~1

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.