Dapatkan waktu dan tanggal git tags

93

Saya memiliki proyek yang menggunakan git dan telah menandai semua rilis dengan sebuah tag.

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

Tujuan saya adalah untuk membuat daftar rilis dan tanggal rilis di antarmuka web (tag / tanggal komitmen = tanggal rilis). Saat ini kami mencantumkan semua rilis dengan menggunakan git tag.

Bagaimana saya bisa mendapatkan waktu dan tanggal kapan tag dibuat (atau komit yang ditunjukkannya)?

HNygard
sumber
2
Sebaiknya tepat di sini bahwa itu adalah tanggal commit dari tag yang Anda cari. Sebagai tag tidak memiliki tanggal.
jobwat
2
Tag beranotasi @jobwat memang punya tanggal .
chrstphrchvz

Jawaban:

70

Gunakan --formatargumen untuk git log:

git log -1 --format=%ai MY_TAG_NAME
pengguna4815162342
sumber
3
TIP - Ganti "TAG" dengan nama tag. Misalnya git log -1 --format=%ai v0.2.3,.
Tobias
5
Jika Anda ingin ISO8601, lakukan --format=%aI(kapital "I")
Chaim Eliyah
git log -1 --format=%ai MY_TAG_NAME | catnonaktifkan tampilan halaman
elinx
Apa yang "-1" lakukan?
Blademaster
@Blademaster Ini memberitahu git loguntuk menunjukkan hanya satu komit, yang berkaitan dengan tag. Perilaku default adalah untuk menampilkan semua komit dari yang ditentukan kembali ke komit pertama di reposotory.
pengguna4815162342
85

Ini selalu berhasil untuk saya:

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

Lihat bagian "PRETTY FORMATS" di halaman manual git-log untuk mengetahui detail dari string format jika Anda menginginkan format tanggal yang berbeda.

Nikos C.
sumber
13
Untuk diperingatkan, ini akan mencantumkan tanggal / waktu untuk komit, tetapi bukan tanggal / waktu untuk tag yang dianotasi.
WiSaGaN
5
Letakkan saja taglog = log --tags --simplify-by-decoration --pretty='format:%ci %d'(perhatikan tanda kutip tunggal, BUKAN tanda kutip ganda) di bagian [alias] file .gitconfig Anda, dan sekarang Anda memiliki perintah git taglog :)
Lambart
45

Satu opsi lagi:

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

Lihat https://git-scm.com/docs/git-for-each-ref#_field_names untuk opsi format

%(creatordate) memberikan tanggal komit yang ditunjuk, untuk melihat tanggal tag dibuat saat digunakan %(taggerdate)

Anda dapat memasukkan cangkang secara langsung:

$> 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'
non sequitor
sumber
3
Ini adalah jawaban terbaik untuk mendapatkan tanggal tag.
Joseph K. Strauss
Atau, Anda bisa mendapatkan stempel waktu unix dengan git for-each-ref --format="%(taggerdate:unix)" refs/tagsatau sebagai substring digit for-each-ref --format="%(taggerdate:raw)" refs/tags
RD
1
Terima kasih! Semua jawaban lainnya hanya memberikan tanggal komit dan bukan tanggal tag.
Sam
Ya, defo jawaban terbaik karena hanya menunjukkan tag yang sebenarnya, tidak semua melakukan, sayang jelek SO memiliki jawaban lain yang dinilai lebih tinggi.
samthebest
2
hasil yang sama dengan lebih sedikit mengetik:git tag --format "%(refname:short) %(creatordate:short)"
Andrew Spencer
27

Perhatikan bahwa kedua solusi di atas memberi Anda tanggal komit, yang bisa sangat berbeda dari saat komit itu diberi tag untuk rilis. Untuk mendapatkan tanggal dari tag itu sendiri, Anda harus menemukan tag itu sendiri rev-parse, membacanya dengan cat-file, dan kemudian menguraikannya. Pipa kecil:

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

Rob Shearer
sumber
Bagus, satu-satunya masalah adalah hasilnya tidak diformat (1419372909 -0300)
Jose_GD
Setelah Anda memiliki commit id dari rev-parse, saya yakin Anda dapat melakukannya: git rev-parse v1.0.0 | xargs git show -s --pretty =% aI
Keith
@Keith Sekarang Anda kembali untuk menunjukkan tanggal penulis dari komit alih-alih tanggal tag, setidaknya untuk tag beranotasi
Ben
3

Tidak ada opsi sederhana dalam perintah git tag untuk melakukan ini. Saya merasa paling nyaman untuk dijalankan

git log --decorate=full

untuk mendaftar semua komit termasuk tag jika ada. Untuk mendaftar hanya komit yang diberi tag, gunakan

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

Untuk penggunaan detail

git help log
VojtaK
sumber
2

seseorang dapat menggunakan gawk(bukan awk) untuk mengonversi tanggal di baris "pemberi tag" menjadi sesuatu yang dapat dibaca manusia:

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

jika ada yang tidak suka gawkmaka datedapat digunakan untuk mengonversi waktu unix:

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

dan contoh ( dnsmasqgit repo):

$ 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
vladis
sumber
apakah Anda mencoba ini dari sisi Anda ??
Vishal Patel
pasti. berfungsi, dnsmasqgit repo, misalnya: $ 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
vladis
0

Semua jawaban di sini bagus dan dalam gaya git yang tepat. Tapi saya membutuhkan tag, tanggal dan pesannya dan hanya 10 tag terakhir. Jadi saya melakukannya dengan cara yang sangat mudah. Tetapi simpan sebagai fungsi shell atau skrip dan itu menjadi satu baris.

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
yuzer
sumber