Git Etiketi listesi, sha1 karmalarını işleme göster


103

bu nedenle git tagkomut mevcut git etiketlerini listeler

tag1
tag2

git tag -n etiketin mesajını yazdırır

tag1  blah blah
tag2  blah blah

Tag1 ve tag2'nin karmasını almanın en iyi yolu nedir?


1
Ayrı ayrı sormayı düşündüğüm bir soru değil, ama neden git tag( -nveya başka bir seçenek ...) ilk etapta commit hash'leri göstermiyor merak ediyorum . İnsanların hangi çözümleri bulduğunu görmek güzel, ancak bunu mevcut seçeneklerde bir tasarım hatası olarak görüyorum.
andreee

Yanıtlar:


145

Git etiketlerini, Tag nesnesinin SHA1 karmasıyla almak için şunu çalıştırabilirsiniz:

git show-ref --tags

Çıktı daha sonra şöyle görünecektir:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0

Her satır, etiketin SHA1 karmasıdır, ardından önek olarak etiket adı gelir refs/tags/.

Kaydetmenin SHA1 karmasını etiket nesnesi yerine istiyorsanız, çalıştırabilirsiniz:

git show-ref --tags -d

Bu, aşağıdaki gibi çıktılar üretecektir:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
3e233dd8080617685992dc6346f739a6f6396aae refs/tags/1.0.0^{}
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
09173980152a7ed63d455829553448ece76c6fdc refs/tags/1.1.0^{}
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
56d803caaa8a93a040b7be0b8a36abdc4ce8c509 refs/tags/1.2.0^{}
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0
1bdf628a70fda7a0d840c52f3abce54b1c6b0130 refs/tags/1.3.0^{}

^{}Etiketin işaret ettiği gerçek kaydetmenin SHA1 karması ile biten satırlar .


7
Bunun hafif ve açıklamalı etiketler arasında ayrım yapmayacağını unutmayın. Hafif etiketler için yürütmeyi gösterir ve ek açıklamalı etiketler için etiket nesnesinin kendisinin karmasını gösterir.
Lily Ballard

20
Başvurusu yapılmış referanslara sahip etiketlerin bir listesini göstermek için (ek açıklamalı etiketler olması durumunda) kullanın git show-ref --tags -d. Başvurulan etiketler bir ^{}.
S. Christoffer Eliesen

51

git tagKomut az gelişmiştir. Kaydetme geçmişi sırasındaki tam etiket ayrıntıları ve etiketler gibi çok şey isteniyor ancak eksik.

Bunun yerine bunu seviyorum, bu da tam olarak istediğimi verir ama alamadığım şeyi verir git tag:

git log --oneline --decorate --tags --no-walk

Bu, etiketlerin ters kronolojik sırayla (tam günlükte olacağı gibi) çok güzel bir renk kodlu görünümünü verir. Bu şekilde, sadece etiketleri görmekle kalmaz, aynı zamanda kısaltılmış hashleri ​​ve etiket commit'lerin commit mesajlarını da görürsünüz.


Takma ad verdim git t ve git tagsaşağıdaki gibi:

git config --global alias.tags "log --oneline --decorate --tags --no-walk"
git config --global alias.t "!git tags"

Not: Git başka bir takma addan (serseri olan) bir takma adı çağırmayı desteklemediği için bash yeniden yönlendirmesini kullanmak zorunda kaldım git t.


Kaydetme tarih ve saatini görmek istiyorsanız şunu deneyin:

git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'

Seçenekte diğer tarih biçimlerini kullanabilir ve --dateseçenekteki benzersiz zevkinize uyması için çıktıyı tam olarak kontrol edebilirsiniz --pretty. Her iki seçenek de git-log Belgelerinde iyi belgelenmiştir .


2
OP'nin sorduğu şey olmasa da (display commit sha1 hash'ları ) bu çok kullanışlıdır çünkü commit mesajları da kullanışlı olabilir. Benden +1.
Stelios Adamantidis

2
@nealmcb git loggüçlüdür! Tam olarak ne istediğinizi göstermesini sağlayabilirsiniz . Deneyin git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'. Diğer tarih formatları da mümkündür. --dateYardım sayfasına bakmanız yeterli . Cevabımı bu seçeneği içerecek şekilde güncelledim.
ADTC

1
@SteliosAdamantidis Aslında cevabım kısaltılmış SHA1 hash değerlerini (ilk 7 karakter) veriyor ve tam uzunlukta hash'ler istiyorsanız, her zaman --prettyve ile değiştirebilirsiniz %H. +1 için teşekkürler :)
ADTC

15

Ek açıklamalı etiketlerin kendi SHA − 1'i vardır, bu nedenle bunlardan vazgeçmemiz gerekir. Ancak, halihazırda bir kaydetmeye işaret ettikleri için hafif etiketlerin referansı kaldırılamaz. Çözmek için, her ikisini de listelemeli ve commit nesnelerini filtrelemeliyiz:

git for-each-ref --sort -v:refname --format '%(objectname) %(objecttype) %(refname)
%(*objectname) %(*objecttype) %(*refname)' refs/tags | grep commit

Hafif etiketlerle sonuç:

589610a0114a375f1bff716dd308cf8df08571d3 commit refs/tags/1.4.9
e25952a74bf379783944bef9c4fcc60600cb764c commit refs/tags/1.4.8
19b1c2c96a9678837f57eac86cf3d22842731510 commit refs/tags/1.4.7
7208212a55c4a56af34da781a7f730d6ddd557a1 commit refs/tags/1.4.6
62ec20337a4125496bd4f56288f3283963153194 commit refs/tags/1.4.5

Ek açıklamalı etiketlerle sonuç:

e2b2d6a172b76d44cb7b1ddb12ea5bfac9613a44 commit refs/tags/v2.11.0-rc3^{}
1310affe024fba407bff55dbe65cd6d670c8a32d commit refs/tags/v2.11.0-rc2^{}
3ab228137f980ff72dbdf5064a877d07bec76df9 commit refs/tags/v2.11.0-rc1^{}
1fe8f2cf461179c41f64efbd1dc0a9fb3b7a0fb1 commit refs/tags/v2.11.0-rc0^{}
454cb6bd52a4de614a3633e4f547af03d5c3b640 commit refs/tags/v2.11.0^{}

Kullanımı git log --tags --oneline --no-walkayrıca açıklamalı etiketleri otomatik olarak dikkate alacaktır. :)
ADTC

11

Herhangi bir ref (dal, etiket ...) tarafından başvurulan SHA1'i almak için şunu kullanın git rev-parse:

git rev-parse tag1^0 tag2^0

Ayrı satırlarda yalnızca tam SHA1'leri yazdıracaktır. ^0Eki etiketi ile karşı sivri işlemek arasında o açıklamalı dışı olup olmadığı bu, SHA1 yazdırılacaktır sağlamak için, özel bir sözdizimi. (Ek açıklamalı etiketler, meta verilerle birlikte bir işleme için bir işaretçi içeren kendi başlarına nesnelerdir. Bir etikete açıklama eklendiğini biliyorsanız ve etiketin SHA1'ini istiyorsanız,^0 .)

Elbette, SHA1'i kabul eden herhangi bir Git komutunun da bir etiketi kabul etmesi gerektiğinden, bunu sık sık yapmanız gerekmez!


En iyi cevap burada, teşekkürler @Jefromi. Bir Windows cmd kabuğunda ^ kullanan herhangi bir git komutunun tırnak içine alınması gerektiğini unutmayın: örneğin git rev-parse "tag1 ^ 0" "tag2 ^ 0".
yoyo

8

Benzer bir sorum vardı, ancak (birkaç) belirli etiketin karmasını istedim. "Show-ref" ifadesinin bir etiket listesi alacağını buldum, bu yüzden şu işi yapıyor:

% git show-ref v3.4.0.13-ga v3.4.0.13-base
bfc7747c4cf67a4aacc71d7a40337d2c3f73a886 refs/tags/v3.4.0.13-base
79ba365e75a4f9cee074d25a605a26acb660b7de refs/tags/v3.4.0.13-ga

Ancak, "git show" ile yapılan bazı deneyler bu komutla sonuçlandı:

% git show --summary --oneline --decorate v3.4.0.13-ga v3.4.0.13-base
79ba365 (tag: v3.4.0.13-ga, rhins013a) commit message the first
bfc7747 (tag: v3.4.0.13-base) commit message the second

"Show-ref" yerine "show" kullanımına daha aşina olduğum için, ikincisini hatırlaması daha kolay ve daha yararlı buluyorum.

Ayrıca Git'te bir etiketin hangi commit'i gösterdiğini nasıl anlarım? Bölümündeki güzel özete bakın. .


3

Etiketlerin imzalanması ve / veya mesajla gönderilmesi gerekir. Hafif etiketlerin SHA1 nesneleri yoktur ve sadece referanslardır. Aksi takdirde deneyin git show.


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

Bu, etiketler için tüm kayıtların bir listesini verir. Açıklamalı etiketlerin referansı kaldırılır. Buraya teşekkür gönderin .


Harika çözüm. Tam referans adı yerine Yalnızca etiket adlarına sahip olmak istiyorsanız, %(refname:short)bunun yerine kullanımı değiştirebilirsiniz %(refname).
Radon8472

2

Anatoly techtonik postasından komutu aldım tag / commit'lerin manşet mesajını ekledim ve güzel cols olarak biçimlendirdim.

Sonuç, git tag -nönek olarak commit-hash ile aynı olan bir çıktıdır .

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'

Değiştirmeye yust yerine, kısa uzun karma sahip olmak isterseniz objectname:shorttarafından objectname.

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.