Git Tag list, tampilkan hashes komit sha1

101

jadi git tagperintah mencantumkan tag git saat ini

tag1
tag2

git tag -n mencetak pesan tag

tag1  blah blah
tag2  blah blah

Apa cara terbaik untuk mendapatkan hash dari tag1 & tag2?

Quang Van
sumber
1
Bukan pertanyaan yang saya pertimbangkan untuk ditanyakan secara terpisah, tetapi saya bertanya-tanya mengapa git tag( -natau beberapa opsi lain ...) tidak menunjukkan hash komit di tempat pertama. Sangat menyenangkan melihat solusi apa yang dibuat orang, tetapi saya menganggap ini sebagai cacat desain dalam opsi yang tersedia.
andreee

Jawaban:

142

Untuk mendapatkan tag git dengan hash SHA1 dari objek Tag, Anda dapat menjalankan:

git show-ref --tags

Outputnya akan terlihat seperti ini:

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

Setiap baris adalah hash SHA1 dari tag, diikuti dengan nama tag yang diawali dengan refs/tags/.

Jika Anda menginginkan hash SHA1 dari komit, sebagai ganti objek tag, Anda dapat menjalankan:

git show-ref --tags -d

Ini akan menghasilkan keluaran seperti:

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^{}

Baris yang diakhiri dengan ^{}start dengan hash SHA1 dari commit aktual yang ditunjuk tag.

peterjmag
sumber
7
Perhatikan, ini tidak akan membedakan antara tag ringan dan beranotasi. Untuk tag ringan itu akan menunjukkan komit dan untuk tag beranotasi itu akan menunjukkan hash dari objek tag itu sendiri.
Lily Ballard
20
Untuk menampilkan daftar tag dengan referensi yang dirujuk (dalam kasus tag beranotasi) gunakan git show-ref --tags -d. Tag yang berbeda diposkan dengan a ^{}.
S. Christoffer Eliesen
49

The git tagperintah terbelakang. Banyak yang diinginkan tetapi hilang di dalamnya, seperti detail tag lengkap dan tag dalam urutan riwayat komit.

Saya suka ini sebaliknya, yang memberikan apa yang saya inginkan tetapi tidak dapat diperoleh dari git tag:

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

Ini memberikan tampilan kode warna yang sangat bagus dari tag dalam urutan kronologis terbalik (seperti yang akan terjadi di log lengkap). Dengan begitu, Anda tidak hanya melihat tag, Anda juga akan melihat hash yang disingkat dan pesan komit dari tag komit.


Saya telah mengaliinya dengan git tdan git tagssebagai berikut:

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

Catatan: Saya harus menggunakan pengalihan bash karena git tGit tidak mendukung pemanggilan alias dari alias lain (yang menyebalkan).


Jika Anda ingin melihat tanggal dan waktu commit, coba:

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

Anda dapat menggunakan format tanggal lain dalam --dateopsi serta mengontrol sepenuhnya keluaran agar sesuai dengan selera unik Anda dalam --prettyopsi tersebut. Kedua opsi tersebut didokumentasikan dengan baik di Dokumentasi git-log .

ADTC
sumber
2
Meskipun tidak seperti yang diminta OP (tampilkan hash komit sha1 ), ini sangat berguna karena pesan komit mungkin berguna juga. +1 dari saya.
Stelios Adamantidis
2
@nealmcb git logsangat kuat! Anda dapat menampilkannya persis apa yang Anda inginkan. Coba git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'. Format tanggal lain juga dimungkinkan. Lihat saja --datedi halaman bantuan. Saya telah memperbarui jawaban saya untuk menyertakan opsi ini.
ADTC
1
@SteliosAdamantidis Sebenarnya jawaban saya memberikan hash SHA1 yang disingkat (7 karakter pertama), dan jika Anda ingin hash lengkap, Anda selalu dapat memodifikasinya dengan --prettydan %H. Terima kasih atas +1 :)
ADTC
15

Tag beranotasi memiliki SHA − 1 sendiri, jadi kita perlu membedakannya. Namun tag ringan tidak dapat dirujuk, karena sudah mengarah ke komit. Untuk menyelesaikannya, kita harus mendaftar keduanya dan memfilter objek komit:

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

Hasil dengan tag ringan:

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

Hasil dengan tag beranotasi:

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^{}
Steven Penny
sumber
Penggunaan git log --tags --oneline --no-walkjuga akan membedakan tag beranotasi secara otomatis. :)
ADTC
11

Untuk mendapatkan SHA1 yang dirujuk oleh segala jenis ref (cabang, tag ...) gunakan git rev-parse:

git rev-parse tag1^0 tag2^0

Ini hanya akan mencetak SHA1 lengkap, pada baris terpisah. The ^0akhiran adalah sintaks khusus, untuk memastikan bahwa ini akan mencetak SHA1 yang dari komit menunjuk ke oleh tag, apakah itu dijelaskan atau tidak. (Tag beranotasi adalah objek dengan sendirinya, yang berisi pointer ke komit bersama dengan metadata. Jika Anda tahu bahwa tag dianotasi, dan ingin tag SHA1, cukup tinggalkan ^0.)

Tentu saja, Anda tidak perlu sering melakukan ini, karena perintah Git apa pun yang menerima SHA1 juga harus menerima tag!

Bertingkat
sumber
Jawaban terbaik di sini, terima kasih @Jefromi. Perhatikan bahwa di shell cmd Windows, semua perintah git yang menggunakan ^ perlu dikutip: misalnya git rev-parse "tag1 ^ 0" "tag2 ^ 0".
yoyo
8

Saya memiliki pertanyaan serupa, tetapi menginginkan hash dari (beberapa) tag tertentu. Saya menemukan bahwa "show-ref" akan mengambil daftar tag, jadi ini tugasnya:

% 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

Namun, beberapa eksperimen dengan "git show" menghasilkan perintah ini:

% 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

Karena saya jauh lebih akrab dengan menggunakan "show" daripada "show-ref", saya merasa yang terakhir lebih mudah diingat dan lebih membantu juga.

Lihat juga ringkasan bagus di Bagaimana cara membedakan mana yang menunjuk ke tag di Git? .

Ted
sumber
3

Tag harus ditandatangani dan / atau dikirimi pesan. Tag ringan tidak memiliki objek SHA1 dan hanya referensi. Kalau tidak coba git show.

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

Ini memberikan daftar semua komit untuk tag. Tag beranotasi berbeda. Kirimkan terima kasih di sini .

anatoly techtonik
sumber
Solusi bagus. Jika Anda ingin memiliki Only tagenames alih-alih nama refname lengkap, Anda dapat mengubah use %(refname:short)sebagai gantinya %(refname).
Radon8472
2

Saya mengambil perintah dari anatoly techtonik post menambahkan pesan utama dari tag / komit dan memformatnya sebagai kolom yang bagus.

Hasilnya adalah keluaran yang identik dengan git tag -ntetapi dengan komit-hash sebagai awalan.

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

Jika Anda ingin memiliki hash yang panjang daripada yang pendek, Anda cukup mengganti objectname:shortdengan objectname.

Radon8472
sumber