tampilkan semua tag di git log

98

Mengapa git log --decoratetidak menampilkan lebih dari satu tag per komit?

EDIT : Charles Bailey telah menemukan jawabannya (setidaknya dalam kasus saya) Pada
dasarnya, saya memiliki satu tag yang menunjuk ke tag lain yang menunjuk ke komit. Karena lapisan tambahan tipuan ini, tag tidak muncul di log. Saya harus memperbaikinya, layu dengan memperbaiki skrip pemberian tag kami ke tag dengan benar, atau dengan beberapa skrip shell voodoo untuk mengikuti tag secara rekursif. Bagaimanapun, saya akan meninggalkan pertanyaan ini hanya untuk referensi jika ada yang menginginkannya. (Saya baru mengenal stack overflow, tetapi saya berasumsi bahwa itu adalah protokol yang benar?)

... Pertanyaan awal mengikuti ...

Backstory: Kami menggunakan GIT di tempat kerja untuk kontrol sumber, dan kami memiliki kebijakan untuk selalu menandai komit saat kami menerapkan. (Ini sebenarnya adalah skrip yang melakukan tag, dan kemudian menarik tag di server). Karena ini adalah aplikasi web dengan penahapan terpisah dan server produksi, kami sering menandai rilis untuk penahapan (untuk pengujian atau apa pun), dan kemudian memberi tag komit yang sama untuk produksi.

Jadi sebenarnya sangat sering kita memiliki beberapa tag pada komit yang sama. Akan sangat menyenangkan bisa melihat ini di log teks, tapi sepertinya tidak mendukungnya. Saat ini saya sedang mengatasi masalah ini dengan memeriksa tag yang saya cari secara manual, atau dengan mengaktifkannya gitk. Meskipun kedua solusi ini berfungsi, menurut saya sangat aneh untuk git log --decoratehanya mendukung satu tag per komit secara default.

Saya melakukan beberapa googling, tetapi tidak menemukan banyak. Apakah saya melewatkan sesuatu yang jelas?

PS (Saya sebenarnya menggunakan string format kustom dengan %d, menurut halaman manual dan beberapa tes cepat, itu setara dengan --decorate)

Jonathan
sumber
12
Sudahkah Anda mencoba 'git log --decorate = full' (tanda kutip minus)?
RDL
1
Versi git apa yang Anda gunakan? Saya melihat banyak tag baik-baik saja di milik saya.
Cascabel
@RDL: full membuatnya mencetak refs / heads / atau refs / tags / yang sesuai, bukan? Tidak lebih atau lebih sedikit ref.
Kaskabel
9
Pertanyaan singkat, apakah Anda menandai tag, atau apakah Anda menandai komit? (Tag dapat membentuk rantai, dalam pengujian saya, hiasi melihat tag yang mengarah ke komit dan tag yang mengarah ke tag ke komit tetapi tidak lebih dari itu.)
CB Bailey
1
@ Charles Bailey Saya pikir Anda mungkin telah menemukan masalahnya. Saya mencoba tes sederhana di tempat kerja (git versi 1.6.3.3), dan tampaknya berfungsi dengan baik. Jadi ini bukan masalah versi. Saya akan menyelidiki lebih lanjut nanti. Terima kasih atas wawasannya!
Jonathan

Jawaban:

17

Perhatikan tentang tag of tag (menandai sebuah tag), yang merupakan asal mula masalah Anda, seperti yang ditunjukkan Charles Bailey dengan benar dalam komentar:

Pastikan Anda mempelajari utas ini , karena mengganti tag bertanda tangan tidaklah mudah:

  • jika Anda telah mendorong sebuah tag, git taghalaman manual dengan serius menyarankan git tag -f Bagar tidak mengganti nama tag " A"
  • jangan mencoba membuat ulang tag yang ditandatangani dengan git tag -f(lihat ekstrak utas di bawah)

    (Ini tentang kasus sudut, tetapi cukup instruktif tentang tag secara umum, dan ini berasal dari kontributor SO lain Jakub Narębski ):

Harap dicatat bahwa nama tag (tag kelas berat, yaitu objek tag) disimpan di dua tempat:

  • di objek tag itu sendiri sebagai isi dari 'tag' header (Anda dapat melihatnya dalam output " git show <tag>" dan juga dalam output " git cat-file -p <tag>", di mana <tag>tag kelas berat, misalnya v1.6.3dalam git.gitrepositori),
  • dan juga merupakan nama default dari referensi tag (referensi di refs/tags/*ruang nama " ") yang mengarah ke objek tag.
    Perhatikan bahwa referensi tag ( referensi yang sesuai di refs/tags/*ruang nama " ") adalah masalah lokal murni ; apa yang dimiliki satu repositori ' refs/tags/v0.1.3', yang lain dapat memiliki ' refs/tags/sub/v0.1.3' misalnya.

Jadi ketika Anda membuat tag bertanda tangan ' A', Anda mengalami situasi berikut (dengan asumsi bahwa itu menunjuk pada beberapa komit)

  35805ce   <--- 5b7b4ead  <=== refs/tags/A
  (commit)       tag A
                 (tag)

Harap perhatikan juga bahwa " git tag -f A A" (perhatikan tidak adanya opsi yang memaksanya menjadi tag beranotasi) adalah noop - ini tidak mengubah situasi.

Jika Anda melakukan " git tag -f -s A A": perhatikan bahwa Anda memaksa untuk menulis tag (jadi git berasumsi bahwa Anda tahu apa yang Anda lakukan), dan salah satu dari -s/ -a/ -moptions digunakan untuk memaksa tag beranotasi (pembuatan objek tag), Anda akan mendapatkan situasi berikut

  35805ce   <--- 5b7b4ea  <--- ada8ddc  <=== refs/tags/A
  (commit)       tag A         tag A
                 (tag)         (tag)

Perhatikan juga bahwa " git show A" akan menampilkan seluruh rantai ke objek non-tag ...

VonC
sumber
86
git log --no-walk --tags --pretty="%h %d %s" --decorate=full

Versi ini akan mencetak pesan komit juga:

 $ git log --no-walk --tags --pretty="%h %d %s" --decorate=full
3713f3f  (tag: refs/tags/1.0.0, tag: refs/tags/0.6.0, refs/remotes/origin/master, refs/heads/master) SP-144/ISP-177: Updating the package.json with 0.6.0 version and the README.md.
00a3762  (tag: refs/tags/0.5.0) ISP-144/ISP-205: Update logger to save files with optional port number if defined/passed: Version 0.5.0
d8db998  (tag: refs/tags/0.4.2) ISP-141/ISP-184/ISP-187: Fixing the bug when loading the app with Gulp and Grunt for 0.4.2
3652484  (tag: refs/tags/0.4.1) ISP-141/ISP-184: Missing the package.json and README.md updates with the 0.4.1 version
c55eee7  (tag: refs/tags/0.4.0) ISP-141/ISP-184/ISP-187: Updating the README.md file with the latest 1.3.0 version.
6963d0b  (tag: refs/tags/0.3.0) ISP-141/ISP-184: Add support for custom serializers: README update
4afdbbe  (tag: refs/tags/0.2.0) ISP-141/ISP-143/ISP-144: Fixing a bug with the creation of the logs
e1513f1  (tag: refs/tags/0.1.0) ISP-141/ISP-143: Betterr refactoring of the Loggers, no dependencies, self-configuration for missing settings.
Marcello de Sales
sumber
2
Lebih baik lagi membuat alias untuk itu :) git config --global alias.tags "! Git log --no-walk --tags --pretty = '% h% d% s' --decorate = full"
GOXR3PLUS
1
Terima kasih @ GOXR3PLUS. Saya harus melakukan: git config --global alias.tags "log --no-walk --tags --pretty = '% h% d% s' --decorate = full"
ajh158
8

Catatan: komit 5e1361c dari brian m. carlson ( bk2204) (untuk git 1.9 / 2.0 Q1 2014) berurusan dengan kasus khusus dalam hal dekorasi log dengan tag:

log: menangani dekorasi dengan benar dengan tag dirantai

git logtidak menangani dekorasi dengan benar saat objek tag mereferensikan objek tag lain yang bukan lagi ref, seperti saat tag kedua dihapus .
Komit tidak akan didekorasi dengan benar karena parse_objectbelum dipanggil pada tag kedua dan oleh karena itu bidang yang diberi tag belum diisi, mengakibatkan tidak ada tag yang dikaitkan dengan komit yang relevan.

Panggil parse_objectuntuk mengisi bidang ini jika tidak ada sehingga rantai tag dapat dideferensi dan komit dapat didekorasi dengan benar.
Sertakan juga pengujian untuk mencegah regresi di masa mendatang.

Contoh:

git tag -a tag1 -m tag1 &&
git tag -a tag2 -m tag2 tag1 &&
git tag -d tag1 &&
git commit --amend -m shorter &&
git log --no-walk --tags --pretty="%H %d" --decorate=full
VonC
sumber