Git etiketlerinin saatini ve tarihini alın


93

Git kullanan bir projem var ve tüm sürümleri bir etiketle etiketledim.

$ git tag
v1.0.0
v1.0.1
v1.0.2
v1.0.3
v1.1.0

Amacım, sürümleri ve yayın tarihlerini bir web arayüzünde listelemek (etiket / commit tarihi = çıkış tarihi). Şu anda kullanarak tüm sürümleri listeliyoruz git tag.

Etiketin yapıldığı zamanı ve tarihi (veya işaret ettiği kaydı) nasıl öğrenebilirim?


2
Burada, peşinde olduğunuz etiketin taahhüt tarihini kesinleştirmek iyidir. Bir etiketin tarihi olmadığı için.
jobwat


Yanıtlar:


70

--formatArgümanı şu amaçlarla kullanın git log:

git log -1 --format=%ai MY_TAG_NAME

3
İPUCU - "TAG" kısmını etiket adıyla değiştirin. Örneğin git log -1 --format=%ai v0.2.3,.
Tobias

5
ISO8601 istiyorsanız, yapın --format=%aI(büyük harf "I")
Chaim Eliyah

git log -1 --format=%ai MY_TAG_NAME | catsayfa görünümünü devre dışı bırak
elinx

"-1" ne yapıyor?
Blademaster

@Blademaster Etikete ait git logolan tek bir commit gösterilmesini söyler . Öntanımlı davranış, depodaki ilk işlemeye kadar belirtilen tüm işlemlerin gösterilmesidir.
user4815162342

85

Bu her zaman benim için çalıştı:

git log --tags --simplify-by-decoration --pretty="format:%ci %d"

Farklı bir tarih biçimlendirmesi istiyorsanız biçim dizesinin ayrıntıları için git-log man sayfasının "OLAĞANÜSTÜ FORMATLAR" bölümüne bakın.


13
Yine de uyarılmak üzere, bu işlem için tarih / saati listeler, ancak ek açıklamalı etiket için tarih / saati listelemez.
WiSaGaN

5
Sadece koymak taglog = log --tags --simplify-by-decoration --pretty='format:%ci %d'senin .gitconfig dosyasının [takma adı] bölümünde (tek DEĞİL çift tırnak dikkat edin), ve şimdi bir git taglog komutu :) var
Lambart

45

Bir seçenek daha:

git for-each-ref --format="%(refname:short) | %(creatordate)" "refs/tags/*"

Biçim seçenekleri için https://git-scm.com/docs/git-for-each-ref#_field_names adresine bakın

%(creatordate) etiketin kullanım sırasında oluşturulduğu tarihi görmek için işaret edilen kaydetme tarihini verir %(taggerdate)

Kabuğu doğrudan dahil edebilirsiniz:

$> git for-each-ref --shell --format="ref=%(refname:short) dt=%(taggerdate:format:%s)" "refs/tags/*"

ref='v1.10' dt='1483807817'
ref='v1.11' dt='1483905854'
ref='v1.12.0' dt='1483974797'
ref='v1.12.1' dt='1484015966'
ref='v1.13' dt='1484766542'
ref='v1.2' dt='1483414377'
ref='v1.3' dt='1483415058'
ref='v1.3-release' dt='' <-- not an annotated tag, just a pointer to a commit so no 'taggerdate', it would have a 'creator date'.
ref='v1.3.1' dt='1483487085'
ref='v1.4' dt='1483730146'
ref='v1.9' dt='1483802985'

3
Etiket tarihini almak için en iyi cevap budur.
Joseph K. Strauss

Alternatif olarak, unix zaman damgasını git for-each-ref --format="%(taggerdate:unix)" refs/tagsalt dize ile veya alt dize olarak alabilirsinizgit for-each-ref --format="%(taggerdate:raw)" refs/tags
RD

1
Teşekkür ederim! Diğer yanıtların tümü etiket tarihini değil, yalnızca taahhüt tarihini verir.
Sam

Evet defo en iyi yanıtı yalnızca gerçek etiketleri gösterdiğinden, tüm taahhütleri göstermez, utanç boktan SO'nun daha yüksek puan alan başka yanıtları vardır.
samthebest

2
daha az yazarak aynı sonuç:git tag --format "%(refname:short) %(creatordate:short)"
Andrew Spencer

27

Yukarıdaki çözümlerin her ikisinin de size kesinleştirme tarihini verdiğini unutmayın; bu, bu işlemenin yayınlanmak üzere etiketlendiği zamandan çılgınca farklı olabilir. Etiketin kendisinin tarihini almak için etiketin kendisini ile bulmalı, birlikte rev-parseokumalı cat-fileve sonra ayrıştırmalısınız. Küçük bir boru hattı:

git rev-parse v1.0.0 | xargs git cat-file -p | egrep '^tagger' | cut -f2 -d '>'


Güzel, tek sorun sonucun biçimlendirilmemiş olması (1419372909 -0300)
Jose_GD

Rev-parse'dan commit id'sine sahip olduğunuzda, yapabileceğinizi düşünüyorum: git rev-parse v1.0.0 | xargs git show -s --pretty =% aI
Keith

@Keith Artık etiketli tarih yerine kaydetmenin yazar tarihini göstermeye geri döndünüz, en azından açıklamalı etiketler için
Ben

3

Git tag komutunda bunu yapmak için basit bir seçenek yoktur. Koşmayı en uygun buldum

git log --decorate=full

eğer varsa, etiketler dahil tüm commit'leri listelemek için. Yalnızca kullanım olarak etiketlenmiş taahhütleri listelemek için

git log --decorate=full --simplify-by-decoration

Ayrıntılar için kullanın

git help log

2

"etiketleyici" satırındaki tarihi insan tarafından okunabilir bir şeye dönüştürmek için gawk(değil awk) kullanılabilir :

git rev-parse v4.4-rc1 | xargs git cat-file -p | gawk '/^tagger/ { print strftime(PROCINFO["strftime"], $(NF-1)) }'

biri gibi yapmazsa gawko zaman dateunix zaman dönüştürmek için kullanılabilir:

git rev-parse v2.76 | xargs git cat-file -p | awk '/^tagger/ { print "@" $(NF-1) }' | xargs date -d

ve örnek ( dnsmasqgit deposu):

$ git rev-parse v2.76 | xargs git cat-file -p | awk '/^tagger/ { print "@" $(NF-1) }' | xargs date -d
Wed May 18 16:52:12 CEST 2016

bunu kendi tarafında mı deniyorsun?
Vishal Patel

kesinlikle. çalışır, dnsmasqgit $ git rev-parse v2.76 | xargs git cat-file -p | awk '/^tagger/ { print strftime(PROCINFO["strftime"], $(NF-1)) }' Wed May 18 16:52:12 CEST 2016
deposu

0

Buradaki tüm cevaplar harika ve uygun git stilinde. Ama bir etikete, tarihine ve mesajına ve sadece son 10 etikete ihtiyacım vardı. Bu yüzden bunu çok yaya bir şekilde yaptım. Ancak bunu bir kabuk işlevi veya komut dosyası olarak kaydedin ve tek satırlık bir hale getirin.

for ver in `git tag | tail -10`; do
    DATE=`git log -1 --format=%ai $ver | awk '{print $1}'`
    MESSAGE=`git tag -n $ver | cat | awk '{a=match($0, $2); print substr($0,a)}'`
    echo "$ver \t| $DATE | $MESSAGE"
done
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.