แสดงแท็กทั้งหมดในบันทึก git


100

เหตุใดจึงgit log --decorateไม่แสดงมากกว่าหนึ่งแท็กต่อการคอมมิต

แก้ไข : Charles Bailey ได้คำตอบ (อย่างน้อยก็ในกรณีของฉัน)
โดยพื้นฐานแล้วฉันมีแท็กหนึ่งแท็กที่ชี้ไปที่แท็กอื่นที่ชี้ไปที่การกระทำ เนื่องจากการกำหนดทิศทางชั้นพิเศษนี้แท็กจึงไม่ปรากฏในบันทึก ฉันจะต้องแก้ไขปัญหานี้โดยแก้ไขสคริปต์การติดแท็กของเราให้แท็กถูกต้องหรือโดยเชลล์สคริปต์วูดูเพื่อติดตามแท็กซ้ำ ๆ อย่างไรก็ตามฉันจะปล่อยคำถามนี้ไว้เพื่อใช้อ้างอิงในกรณีที่มีใครต้องการ (ฉันเพิ่งเคยใช้ stack overflow แต่ฉันคิดว่านั่นเป็นโปรโตคอลที่ถูกต้องหรือไม่)

... คำถามเดิมมีดังนี้ ...

Backstory: เราใช้ GIT ในที่ทำงานเพื่อควบคุมแหล่งที่มาและเรามีนโยบายในการติดแท็กคอมมิตเสมอเมื่อเราปรับใช้ (จริงๆแล้วเป็นสคริปต์ที่ทำแท็กจากนั้นดึงแท็กบนเซิร์ฟเวอร์) เนื่องจากเป็นเว็บแอปพลิเคชันที่มีเซิร์ฟเวอร์การจัดเตรียมและการใช้งานจริงแยกกันเราจึงมักติดแท็กรุ่นสำหรับการจัดเตรียม (สำหรับการทดสอบหรืออะไรก็ตาม) จากนั้นจึงแท็กคอมมิตเดียวกันสำหรับการใช้งานจริง

ดังนั้นบ่อยครั้งที่เรามีแท็กหลายแท็กในคอมมิตเดียวกัน มันจะดีมากที่สามารถเห็นสิ่งนี้ในบันทึกข้อความ แต่ดูเหมือนจะไม่รองรับ ขณะนี้ฉันกำลังแก้ไขปัญหาโดยการตรวจสอบแท็กที่ฉันกำลังค้นหาด้วยตนเองหรือเริ่มgitkทำงาน แม้ว่าทั้งสองวิธีนี้จะใช้งานได้ แต่สำหรับฉันแล้วมันแปลกจริงๆgit log --decorateที่สนับสนุนเพียงหนึ่งแท็กต่อการคอมมิตตามค่าเริ่มต้น

ฉันเล่น Googling ไปรอบ ๆ แต่ก็ไม่พบอะไรมากนัก ฉันขาดอะไรบางอย่างที่ชัดเจนหรือไม่?

PS (จริงๆแล้วฉันใช้สตริงรูปแบบที่กำหนดเอง%dตามหน้าคนและการทดสอบอย่างรวดเร็วมันเทียบเท่ากับ--decorate)


12
คุณได้ลอง 'git log --decorate = full' (ลบเครื่องหมายคำพูด) หรือไม่?
RDL

1
คุณใช้คอมไพล์เวอร์ชันใด ฉันเห็นแท็กหลายแท็กดีในของฉัน
Cascabel

@RDL: full ทำให้มันพิมพ์ refs / head / หรือ refs / tags / ตามความเหมาะสมใช่ไหม ไม่มากขึ้นหรือน้อยลง
Cascabel

9
คำถามด่วนคุณติดแท็กหรือคุณติดแท็กคอมมิต? (แท็กสามารถสร้างเครือข่ายได้ในการทดสอบของฉันจะมองไปที่แท็กที่ชี้ไปที่คอมมิตและแท็กที่ชี้ไปที่แท็กไปยังคอมมิต แต่ไม่มากไปกว่านั้น)
CB Bailey

1
@ ชาร์ลส์เบลีย์ฉันคิดว่าคุณอาจพบปัญหา ฉันลองทดสอบง่ายๆในที่ทำงาน (git เวอร์ชัน 1.6.3.3) และดูเหมือนว่าจะใช้ได้ ดังนั้นจึงไม่ใช่ปัญหาเรื่องเวอร์ชัน ฉันจะตรวจสอบเพิ่มเติมในภายหลัง ขอบคุณสำหรับข้อมูลเชิงลึก!
Jonathan

คำตอบ:


17

หมายเหตุเกี่ยวกับแท็กของแท็ก (การติดแท็ก) ซึ่งเป็นจุดเริ่มต้นของปัญหาของคุณตามที่Charles Baileyได้ระบุไว้อย่างถูกต้องในความคิดเห็น:

ตรวจสอบให้แน่ใจว่าคุณได้ศึกษาหัวข้อนี้เนื่องจากการลบล้างแท็กที่มีลายเซ็นนั้นไม่ใช่เรื่องง่าย:

  • หากคุณดันแท็กไปแล้วgit tagหน้าคนขอแนะนำgit tag -f Bให้เปลี่ยนชื่อแท็กง่ายๆ" A"
  • อย่าพยายามสร้างแท็กที่เซ็นชื่อใหม่ด้วยgit tag -f(ดูที่แยกเธรดด้านล่าง)

    (เป็นเรื่องเกี่ยวกับกรณีมุม แต่ค่อนข้างให้คำแนะนำเกี่ยวกับแท็กโดยทั่วไปและมาจากผู้สนับสนุน SO คนอื่นJakub Narębski ):

โปรดทราบว่าชื่อของแท็ก (แท็กรุ่นหนาเช่นแท็กอ็อบเจ็กต์) ถูกเก็บไว้ในสองตำแหน่ง:

  • ในออบเจ็กต์แท็กเองเป็นเนื้อหาของส่วนหัว "แท็ก" (คุณสามารถดูได้ในเอาต์พุตของ " git show <tag>" และในเอาต์พุตของ " git cat-file -p <tag>" โดยที่<tag>แท็กรุ่นหนาเช่นv1.6.3ในที่git.gitเก็บ)
  • และยังเป็นชื่อเริ่มต้นของการอ้างอิงแท็ก (การอ้างอิงในrefs/tags/*เนมสเปซ "") ที่ชี้ไปยังออบเจ็กต์แท็ก
    โปรดทราบว่าการอ้างอิงแท็ก( การอ้างอิงที่เหมาะสมในrefs/tags/*เนมสเปซ "") เป็นเรื่องเฉพาะในพื้นที่เท่านั้น สิ่งที่ที่เก็บหนึ่งมีใน ' refs/tags/v0.1.3' อื่น ๆ สามารถมีได้ใน ' refs/tags/sub/v0.1.3' เช่น

ดังนั้นเมื่อคุณสร้างแท็กที่ลงนาม ' A' คุณจะมีสถานการณ์ต่อไปนี้ (สมมติว่ามันชี้ไปที่การกระทำบางอย่าง)

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

โปรดทราบด้วยว่า " git tag -f A A" (สังเกตว่าไม่มีตัวเลือกบังคับให้เป็นแท็กที่มีคำอธิบายประกอบ) เป็น noop ซึ่งจะไม่เปลี่ยนแปลงสถานการณ์

หากคุณทำ " git tag -f -s A A": โปรดทราบว่าคุณบังคับให้เขียนแท็ก (ดังนั้น git จะถือว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่) และหนึ่งใน-s/ -a/ -mตัวเลือกถูกใช้เพื่อบังคับแท็กที่มีคำอธิบายประกอบ (การสร้างวัตถุแท็ก) คุณจะได้รับ สถานการณ์ต่อไปนี้

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

โปรดทราบว่า " git show A" จะแสดงห่วงโซ่ทั้งหมดลงไปยังออบเจ็กต์ที่ไม่ใช่แท็ก ...


90
git log --no-walk --tags --pretty="%h %d %s" --decorate=full

เวอร์ชันนี้จะพิมพ์ข้อความคอมมิตด้วย:

 $ 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.

2
ยิ่งสร้างนามแฝงให้ดียิ่งขึ้น :) git config --global alias.tags "! git log --no-walk --tags --pretty = '% h% d% s' --decorate = full"
GOXR3PLUS

1
ขอบคุณ @ GOXR3PLUS ฉันต้องทำ: git config --global alias.tags "log --no-walk --tags --pretty = '% h% d% s' --decorate = full"
ajh158

8

หมายเหตุ: การกระทำ 5e1361cจากbrian m carlson ( bk2204) (สำหรับ git 1.9 / 2.0 Q1 2014) เกี่ยวข้องกับกรณีพิเศษในแง่ของการตกแต่งบันทึกด้วยแท็ก:

บันทึก: จัดการการตกแต่งด้วยแท็กที่ถูกล่ามโซ่อย่างเหมาะสม

git logไม่ถูกต้องจัดการตกแต่งเมื่อมีวัตถุแท็กแท็กอ้างอิงวัตถุอื่นที่ไม่ได้เตะเช่นเมื่อแท็กที่สองถูกลบ
การคอมมิตจะไม่ได้รับการตกแต่งอย่างถูกต้องเนื่องจากparse_objectไม่ได้ถูกเรียกบนแท็กที่สองดังนั้นจึงไม่มีการกรอกฟิลด์ที่แท็กทำให้ไม่มีแท็กใดที่เชื่อมโยงกับคอมมิตที่เกี่ยวข้อง

เรียกparse_objectให้กรอกข้อมูลในฟิลด์นี้หากไม่มีเพื่อให้สามารถยกเลิกการอ้างอิงเชนของแท็กและสามารถตกแต่งคอมมิตได้อย่างเหมาะสม
รวมการทดสอบด้วยเพื่อป้องกันการถอยหลังในอนาคต

ตัวอย่าง:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.