Bagaimana menemukan tag yang terkait dengan git commit yang diberikan?

90

Untuk rilis saya biasanya memberi tag dengan sesuatu seperti v1.1.0. Selama skrip build saya, saya membuat file fwVersion.c yang berisi info git saat ini. Saat ini, saya telah komit, dan info cabang di file tersebut, tetapi saya ingin menambahkan tag.

Apakah ini mungkin?

wes
sumber

Jawaban:

115

Periksa dokumentasi untuk git describe. Ia menemukan tag terdekat ke komit yang diberikan (yaitu tag yang menunjuk ke leluhur komit) dan menjelaskan komit itu dalam istilah tag.

Jika Anda hanya ingin mengetahui apakah komit diarahkan ke sebuah tag, maka Anda dapat memeriksa keluaran dari:

git describe --exact-match <commit-id>
CB Bailey
sumber
32
git describe --tags <commit-id>untuk tag tanpa anotasi
Aleksandr Levchuk
1
Aku suka ini. Spefically, saya suka bahwa saya bisa mendapatkan manusia yang dapat dibaca dari revisi saat ini:git describe --all --exact-match `git rev-parse HEAD`
dsummersl
5
Dalam versi yang lebih baru, git describe --tags --abbrev=0 REVakan berguna bila Anda tidak ingin sampah di tag.
Craig Ringer
1
git describe --all(untuk komit yang saat ini diperiksa) atau git describe --all <commit>selalu melakukan hampir semua yang saya inginkan.
rfay
Bagian terbaik dari menggunakan versi dari git adalah tidak ada lagi hardcoding versi dalam sumber ketika perangkat lunak diterapkan. Cara git menjelaskan untuk menemukan tag terdekat dapat digunakan untuk menghitung nomor versi berikutnya dan hanya menambahkan tag ref ke repo dan nama paket.
Sid
64

Jika yang Anda inginkan adalah tag pertama yang berisi komit maka:

git describe --contains <commit>

memberikan jawaban terbaik IMO. Jika Anda memiliki tag yang lebih sering daripada menggunakan "git tag --contains" pada komit lama di repositori besar dapat memakan waktu beberapa saat untuk dijalankan dan memberi Anda semua tag yang berisi komit itu.

Bentuk git menggambarkan ini berjalan sangat cepat dan memberi Anda nilai keluaran tunggal yang merupakan tag pertama yang berisi komit dan seberapa jauh komit Anda.

Jay
sumber
27

Bagaimana dengan ini?

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

Ini memberi Anda semua tag yang dimiliki komit yang diberikan (sedangkan git describehanya memberi Anda satu), dan tidak menyertakan tag pada komit turunan (seperti git tag --containshalnya).

Albertas Agejevas
sumber
Saya suka ini karena tidak ada pesan kesalahan yang ditulis ke stderr. Terima kasih.
Basuke
23

Anda dapat menemukan informasi ini di manual

git tag --contains <commit>
dharga
sumber
3
Ini akan mencantumkan semua tag yang berisi komit yang diberikan (yaitu tag yang menunjuk ke turunan dari komit yang diberikan), jadi tidak perlu memberikan satu tag untuk komit yang diberikan atau informasi tentang tag mana yang paling dekat, kecuali daftar hanya berisi satu komit.
CB Bailey
4
Seperti yang dikatakan Charles Bailey di atas, bukan itu yang saya cari. Mungkin Anda harus RTFM :)
wes
1
Maaf atas jawaban yang salah. Ketika saya memeriksa sepertinya melakukan apa yang Anda minta. Saya melakukan RTFM, saya hanya menyelesaikan masalah yang salah. Harapan Bailey menawarkan solusi yang membantu Anda.
dharga
6
Anda tidak perlu membaca seluruh panduan git sebelum mengajukan pertanyaan git tentang SO, bukan? indeks google SO jauh lebih baik daripada halaman manual git ...
aaronstacy
13

Saya menemukan kombinasi dari kedua jawaban teratas untuk memberi saya apa yang saya inginkan:

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

Ini memberi Anda tag HANYA untuk komit itu dan untuk yang tanpa penjelasan. Berguna ketika Anda ingin menemukan tag dan tidak khawatir tentang menghapus pemformatannya (untuk Jenkins misalnya).

misalnya. $ git describe --tags --exact-match head~2

Memberi anda:

$ ReleaseBeta
Christopher Alexander
sumber
0

Konsolidasi beberapa jawaban:

git tag --contains [<ref>]

dan

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

atau hanya

git tag

berperilaku sama, mencetak setiap (dan semua) tag untuk ref yang ditentukan atau komit saat ini jika tidak ditentukan.

git describe --tags [<ref>]

di mana <ref>default untuk komit saat ini, keluar dengan 128 jika tidak ada tag yang diasosiasikan dengan komit, dan mencetak tag yang terkait dengan komit (sepertinya tidak ada pola).

git describe [<ref>] berperilaku sama seperti dengan --tags hanya mencetak tag beranotasi.

Menyediakan opsi --containsuntuk describemencetak tag yang terkait dengan leluhur komit yang ditentukan. Sebagai contoh

$ 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

bschlueter.dll
sumber