Bagaimana cara mendapatkan nama tag terbaru di cabang saat ini di Git?


462

Apa cara paling sederhana untuk mendapatkan tag terbaru di Git?

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

keluaran:

a
b
c

Haruskah saya menulis skrip untuk mendapatkan datetime setiap tag dan membandingkannya?


1
tag terbaru dibuat atau tag terbaru dipesan berdasarkan tanggal komit? Jawaban Anda yang diterima menunjukkan tag yang dibuat terbaru. Ini bisa menjadi masalah jika seseorang memutuskan untuk mengubah tag yang ada ...
Paebbels

Jawaban:


412

Anda bisa melihat git describe, yang melakukan sesuatu yang dekat dengan apa yang Anda minta.


194
Dengan --abbrev=0itu harus mengembalikan tag beranotasi terdekat
Jakub Narębski

13
Mengembalikan tag terbaru di cabang saat ini.
brittohalloran

42
Untuk mendapatkan tag beranotasi terbaru yang menargetkan hanya komit saat ini di cabang saat ini , gunakan git describe --exact-match --abbrev=0.
Naftuli Kay

5
Jawaban ini, dengan komentar, tidak memberikan tag yang benar untuk saya. @kilianic memberikan solusi yang benar.
Herman J. Radtke III

20
git describe --tagsdan bandingkan tag terakhir com di halaman rilis github
Adriano Resende

627

Untuk mendapatkan tag terbaru:

git describe --tags

Untuk mendapatkan tag beranotasi terbaru :

git describe --abbrev=0

2
Yap, seperti halaman manual untuk git describemengatakan: --abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
Giorgos Kylafas

22
Atau hanyagit describe --tags
james_womack

5
Jawaban ini (dan mungkin yang lain) mengalami masalah jika Anda memiliki dua tag yang menunjuk ke komit yang sama. Kecuali jika tag adalah tag beranotasi, saya pikir tidak ada cara bagi git untuk membedakan mana dari keduanya yang dibuat sebelumnya.
Paul Lynch

10
Ini harus menjadi jawaban yang diterima. Terima kasih telah mengirimkan.
crmpicco

6
jika Anda ingin secara langsung checkout tag terbaru:git checkout $(git describe --abbrev=0 --tags)
JohnRDOrazio

321

Akan menampilkan tag komit yang ditandai terbaru di semua cabang

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

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

20
Ini jawaban terbaik. Ini benar-benar mendapatkan tag di semua cabang, bukan hanya cabang saat ini, seperti jawaban "benar" saat ini.
brittohalloran

61
Kecuali pertanyaan khusus menanyakan cabang saat ini.
michaeltwofish

3
@michaeltwofish, pada saat itu saya tidak mengetahuinya, saya menemukan jawabannya kemudian dan mengoreksi jawaban saya. Maaf soal itu.
kilianc

3
Catatan: Perintah ini mengembalikan tag "terbaru" walaupun tag ini ada di cabang lain.
Alan Zhiliang Feng

47

Untuk mendapatkan tag terbaru, Anda dapat melakukan:

$ git untuk-masing-masing ref / tag ref --sort = -taggerdate --format = '% (refname)' --count = 1

Tentu saja, Anda dapat mengubah argumen hitung atau mengurutkan bidang yang diinginkan. Tampaknya Anda mungkin bermaksud mengajukan pertanyaan yang sedikit berbeda, tetapi ini menjawab pertanyaan saat saya menafsirkannya.


2
Ini hampir persis apa yang saya cari (tag terbaru di semua cabang), tetapi setidaknya dengan versi git saya (1.7.7.6) tag diproduksi dalam urutan yang sama untuk keduanya --sort=-authordatedan --sort=authordate.
larsks

3
Aha, karena apa yang sebenarnya Anda inginkan adalah --sort=-taggerdate. Untuk tag, authordatedan committerdatekosong (jadi tidak berguna sebagai tombol sortir).
larsks

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

5
Sungguh, menolak jawaban yang benar-benar sempurna yang hampir 5 tahun tanpa komentar? Itu tidak sopan.
William Pursell

1
Dan --points-at=$SHAakan memberi Anda tag untuk hash komit.
Ryan

35

Bagaimana dengan ini?

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

Secara teknis, Anda tidak akan selalu mendapatkan tag terbaru, tetapi komit terbaru yang ditandai, yang mungkin atau mungkin bukan hal yang Anda cari.


Yang ini tidak mendapatkan tag terbaru di cabang saat ini tetapi untuk cabang mana pun. Yang hebat, karena memang itulah yang saya butuhkan. Terima kasih Wincent.
jasongregori

2
Jika Anda perlu untuk mendapatkan pola tag pencocokan Anda dapat menggunakan --tags=<pattern>di rev-list. Misalnya, dapatkan tag versi terakhirgit describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
Wirone

1
$ (git jelaskan - berisi $ (git rev-parse KEPALA))
Vaidas Zilionis

Terima kasih, itu berhasil, tetapi, saya harus menambahkangit describe --tags $(git rev-list --tags --max-count=1)
Gianluca Casati

25

Anda dapat menjalankan: git describe --tags $(git rev-list --tags --max-count=1)bicarakan di sini: Cara mendapatkan nama tag terbaru?


Saya mulai dengan jawaban teratas / diterima dan terus menurun. Ini adalah jawaban pertama yang benar-benar memberi saya tag terbaru (tidak yakin mengapa tetapi lama polos git describe ...mengembalikan tag sebelumnya ?!)
Jeremy Davis

Ini adalah satu-satunya yang bekerja untuk saya. Mencoba beberapa --abbrev=0jawaban dan mereka memotong bagian dari tag yang saya inginkan.
Luke Davis

22

"Paling baru" bisa memiliki dua arti dalam hal git.

Anda dapat mengartikan, "tag mana yang memiliki tanggal pembuatan terbaru", dan sebagian besar jawaban di sini adalah untuk pertanyaan itu. Dalam hal pertanyaan Anda, Anda ingin mengembalikan tag c.

Atau Anda bisa berarti "tag mana yang paling dekat dalam sejarah pengembangan dengan beberapa cabang bernama", biasanya cabang tempat Anda berada HEAD,. Dalam pertanyaan Anda, ini akan mengembalikan tag a.

Ini mungkin berbeda tentu saja:

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

Bayangkan pengembang tag'ed Zsebagai v0.2hari Senin, dan kemudian tag'ed Qsebagai v0.1Selasa. v0.1adalah yang lebih baru, tetapi v0.2lebih dekat dalam sejarah pengembangan ke HEAD, dalam arti bahwa jalan itu dimulai pada titik yang lebih dekat ke HEAD.

Saya pikir Anda biasanya menginginkan jawaban kedua ini, lebih dekat dalam sejarah pembangunan. Anda dapat menemukannya dengan menggunakan git log v0.2..HEADdll untuk setiap tag. Ini memberi Anda jumlah komit pada HEAD karena jalan yang berakhir di v0.2menyimpang dari jalan diikuti oleh HEAD.

Berikut ini adalah skrip Python yang melakukan itu dengan mengulangi semua tag yang menjalankan pemeriksaan ini, dan kemudian mencetak tag dengan komit paling sedikit di HEAD karena jalur tag berbeda:

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

git describemelakukan sesuatu yang sedikit berbeda, yaitu melacak kembali dari (misalnya) KEPALA untuk menemukan tag pertama yang ada di jalur kembali dalam sejarah dari KEPALA. Dalam istilah git, git describecari tag yang "dapat dijangkau" dari HEAD. Karena itu ia tidak akan menemukan tag seperti v0.2itu yang tidak ada di jalur kembali dari KEPALA, tetapi jalur yang menyimpang dari sana.



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

JIKA ANDA PERLU LEBIH DARI SATU TAG TERAKHIR

(git jelaskan - tag terkadang memberikan hash yang salah, saya tidak tahu kenapa, tapi bagi saya --max-count 2 tidak berfungsi)

ini adalah bagaimana Anda bisa mendapatkan daftar dengan 2 nama tag terbaru dalam urutan kronologis terbalik, berfungsi dengan baik di git 1.8.4. Untuk versi git yang lebih lama (seperti 1.7. *), Tidak ada string "tag:" dalam keluaran - hapus saja panggilan terakhir

Jika Anda menginginkan lebih dari 2 tag terbaru - ubah "sed 2q" menjadi "sed 5q" atau apa pun yang Anda butuhkan

Kemudian Anda dapat dengan mudah menguraikan setiap nama tag ke variabel atau lebih.


ini sangat membantu, banyak pengembang akan mencoba untuk mengotomatiskan proses rilis dengan memutar kembali ke tag sebelumnya jika penyebaran rusak. Hal yang luar biasa !!!
AkD

1
Untuk mengambil ini lebih jauh: git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p' di mana %Dtidak termasuk ()karakter sekitarnya , dan sedmulai 5q meninggalkan 4 baris sebelum 5, kemudian mencetak semua karakter antara 'tag: `dan yang pertama', '. Jadi ... dengan asumsi tidak ada koma yang digunakan di dalam tag, ini berfungsi dengan baik.
Cometsong

14

Apa yang salah dengan semua saran (kecuali penjelasan Matthew Brett , terbaru dari posting jawaban ini)?

Jalankan saja perintah apa pun yang disediakan oleh orang lain pada riwayat jQuery Git ketika Anda pada titik riwayat yang berbeda dan periksa hasilnya dengan representasi riwayat pemberian tag visual (saya melakukan itu sebabnya Anda melihat posting ini):

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

Saat ini banyak proyek yang melakukan rilis (dan penandaan) di cabang terpisah dari jalur utama .

Ada alasan kuat untuk ini. Lihat saja proyek JS / CSS yang sudah mapan. Untuk konvensi pengguna, mereka membawa file rilis biner / yang diperkecil dalam DVCS. Secara alami sebagai pengelola proyek Anda tidak ingin membuang sejarah diff arus utama Anda dengan gumpalan biner yang tidak berguna dan melakukan komit dari pembuatan artefak di luar jalur utama .

Karena Git menggunakan DAG dan bukan sejarah linear - sulit untuk mendefinisikan metrik jarak sehingga kita dapat mengatakan - oh rev itu yang paling dekat dengan saya HEAD!

Saya memulai perjalanan saya sendiri (lihat ke dalam, saya tidak menyalin gambar bukti mewah ke posting panjang ini):

Apa tag terdekat di masa lalu sehubungan dengan percabangan di Git?

Saat ini saya memiliki 4 definisi jarak antara tag dan revisi yang masuk akal dengan menurunnya kegunaan:

  • panjang jalur terpendek dari HEADuntuk menggabungkan basis dengan tag
  • tanggal dari dasar penggabungan antara HEADdan tag
  • jumlah revs yang dapat dijangkau dari HEAD tetapi tidak dapat dijangkau dari tag
  • tanggal tag terlepas dari gabungan basis

Saya tidak tahu cara menghitung panjang jalur terpendek .

Script bahwa tag semacam menurut tanggal dari dasar penggabungan antara HEADdan tag:

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

Ini dapat digunakan pada sebagian besar proyek.

Script yang mengurutkan tag berdasarkan jumlah revs yang dapat dijangkau dari HEAD tetapi tidak dapat dijangkau dari tag:

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

Jika riwayat proyek Anda memiliki tanggal yang aneh pada komitmen (karena rebases atau penulisan ulang riwayat lain atau orang bodoh lupa untuk mengganti baterai BIOS atau sihir lain yang Anda lakukan pada riwayat) gunakan skrip di atas.

Untuk opsi terakhir ( tanggal tag terlepas dari basis gabungan ) untuk mendapatkan daftar tag yang diurutkan berdasarkan tanggal gunakan:

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

Untuk mengetahui tanggal revisi saat ini, gunakan:

$ git log --max-count=1

Catatan yang git describe --tagsmemiliki penggunaan pada kasus sendiri tetapi tidak untuk menemukan tag yang diharapkan manusia terdekat dalam sejarah proyek .

CATATAN Anda dapat menggunakan resep di atas pada revisi apa pun, cukup ganti HEADdengan yang Anda inginkan!


12

git describe --abbrev=0 --tags

Jika Anda tidak melihat tag terbaru, pastikan untuk mengambil asal sebelum menjalankan itu:

git remote update


12
git tag -l ac* | tail -n1

Dapatkan tag terakhir dengan awalan "ac" . Misalnya, tag dinamai dengan ac1.0.0, atau ac1.0.5. Tag lain yang diberi nama 1.0.0, 1.1.0akan diabaikan.

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

Dapatkan tag terakhir, karakter siapa yang pertama 0-9. Jadi, tag tersebut dengan char pertama a-zakan diabaikan.

Info lebih lanjut

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

git tag -l <pattern>

Daftar tag dengan nama yang cocok dengan pola yang diberikan (atau semua jika tidak ada pola yang diberikan). Menjalankan "git tag" tanpa argumen juga mencantumkan semua tag. Polanya adalah shell wildcard (yaitu, dicocokkan menggunakan fnmatch (3)). Beberapa pola dapat diberikan; jika ada yang cocok, tag ditampilkan.


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

Memperbarui

Dengan git tag --help, tentang sortargumennya. Ini akan digunakan lexicorgraphic ordersecara default, jika tag.sortproperti tidak ada.

Urutkan default pesanan ke nilai yang dikonfigurasikan untuk variabel tag.sort jika ada, atau pesan leksikografis sebaliknya. Lihat git-config (1).

Setelah google, seseorang berkata git 2.8.0 mendukung sintaks berikut.

git tag --sort=committerdate

itu bukan wajan untuk saya, tag terakhir adalah 2.11.174 tetapi ini mencetak 2.11.99 karena urutkan tidak seperti versi
Ali.MD

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

Tolong jelaskan bagaimana potongan kode ini akan menyelesaikan masalah, alih-alih memposting jawaban hanya kode.
Arun Vinoth

5

Berikut ini berfungsi untuk saya jika Anda perlu dua tag terakhir (misalnya, untuk menghasilkan log perubahan antara tag saat ini dan tag sebelumnya). Saya telah mengujinya hanya dalam situasi di mana tag terbaru adalah 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_"`

Itu sesuai dengan kebutuhan saya, tetapi karena saya bukan penyihir git, saya yakin itu bisa lebih ditingkatkan. Saya juga menduga itu akan pecah jika sejarah komit bergerak maju. Saya hanya berbagi kalau-kalau itu membantu seseorang.


4

Pikiran pertama saya adalah Anda dapat menggunakan git rev-list HEAD, yang mencantumkan semua revs dalam urutan kronologis terbalik, dikombinasikan dengan git tag --contains. Ketika Anda menemukan referensi di mana git tag --containsmenghasilkan daftar kosong, Anda telah menemukan tag terbaru.


4

Jika Anda ingin menemukan tag terakhir yang diterapkan pada cabang tertentu, Anda dapat mencoba yang berikut:

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

3

Jika Anda memerlukan satu liner yang mendapatkan nama tag terbaru (berdasarkan tanggal tag) pada cabang saat ini :

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

Kami menggunakan ini untuk mengatur nomor versi dalam pengaturan.

Contoh keluaran:

v1.0.0

Bekerja di Windows juga.


1
Di Linux (Debian Stretch) saya dapatkan-bash: syntax error near unexpected token '('
Jeremy Davis

1
Jika saya membungkus bagian itu dalam tanda kutip (yaitu --format="%(refname:short)") dan melewati --points-at=HEADitu berfungsi. Dengan saklar terakhir itu tidak mengembalikan apa-apa, saya kira karena saya HEADtidak ditandai?
Jeremy Davis

@ JeremyDavis, ya saya pikir itu karena Anda HEADtidak ditandai.
Markus

2

Ini adalah utas lama, tetapi tampaknya banyak orang kehilangan jawaban yang paling sederhana, termudah, dan paling benar untuk pertanyaan OP: untuk mendapatkan tag terbaru untuk cabang saat ini , yang Anda gunakan git describe HEAD. Selesai

Sunting: Anda juga dapat memberikan refname yang valid, bahkan jarak jauh; yaitu, git describe origin/masterakan memberi tahu Anda tag terbaru yang dapat dijangkau dari asal / master.


Tidak ada yang menjamin bahwa "tag terbaru" ditangani oleh cabang mana pun. Dua solusi yang berfungsi adalah for-each-refperintah ( stackoverflow.com/a/5261470/515973 ) dan kombinasi rev-listdan describe( stackoverflow.com/a/7979255/515973 )
Julien Carsique

1
Ini tidak mendapatkan tag terbaru untuk saya.
K - Keracunan dalam SO tumbuh.

git describe branchname --tagstidak berfungsi bagi saya untuk mendapatkan tag terbaru pada cabang (git versi 2.12.2)
Rob_M

0

Untuk mendapatkan tag terbaru hanya pada cabang / nama tag saat ini yang diawali dengan cabang saat ini, saya harus menjalankan yang berikut

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

Pemimpin cabang:

git checkout master

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

master-1448

Cabang kustom:

git checkout 9.4

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

9.4-6

Dan kebutuhan akhir saya untuk meningkatkan dan mendapatkan tag +1 untuk penandaan berikutnya.

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

0

Untuk pertanyaan seperti yang diajukan,

Cara mendapatkan nama tag terbaru di cabang saat ini

kamu ingin

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

--first-parentmemberitahu git loguntuk tidak merinci sejarah gabungan, --pretty=%dmengatakan untuk hanya menunjukkan dekorasi yaitu nama lokal untuk setiap komit. grep -m1mengatakan "cocokkan hanya satu", sehingga Anda hanya mendapatkan tag terbaru.


0

jika tag Anda dapat diurutkan:

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

0

Tidak banyak menyebutkan tag yang tidak ditandai vs yang dianotasi di sini. 'jelaskan' berfungsi pada tag beranotasi dan mengabaikan yang tidak ditandai.

Ini jelek tapi apakah pekerjaan yang diminta dan tidak akan menemukan tag pada cabang lain (dan bukan pada yang ditentukan dalam perintah: master dalam contoh di bawah ini)

Pemfilteran harus dioptimalkan (dikonsolidasikan), tetapi sekali lagi, ini sepertinya berhasil.

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

Kritik diterima karena saya sekarang akan menggunakan ini :)


-2

Cara mudah lain untuk mendapatkan nama tag terbaru adalah dengan

git tag | tail -1

atau

TAG=$(git tag | tail -1)

untuk menyimpannya dalam variabel.

git tagdaftar semua tag yang tersedia dan akan mengembalikan baris terakhir jika hasilnya.tail-1


4
Tanpa memilah, ini adalah langkah yang buruk.
mjd2
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.