ทำไมฉันถึงต้องใส่ใจกับแท็กที่มีน้ำหนักเบาและมีคำอธิบายประกอบ


346

ฉันเปลี่ยนจากการโค่นล้มเป็น Git เป็น VCS ประจำวันของฉันเมื่อปีที่แล้วและฉันยังคงพยายามที่จะเข้าใจจุดที่ดีกว่าของ "Git-think"

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

เมื่อฉันเปลี่ยนมาใช้ Git เป็นครั้งแรกแท็กที่มีน้ำหนักเบาดูเหมือนจะเป็นสิ่งที่ดีที่สุดตั้งแต่หั่นขนมปัง ฉันสามารถชี้ไปที่คำสั่งแล้วพูดว่า "นั่นคือ 1.0" ฉันมีปัญหาในการเข้าใจว่าแท็กจะต้องเป็นมากกว่านั้นได้อย่างไร แต่ฉันไม่อยากจะเชื่อเลยว่าผู้เชี่ยวชาญของ Git ในโลกนี้ชอบแท็กที่มีคำอธิบายประกอบโดยพลการ! แล้วเสียงขรมทั้งหมดเกี่ยวกับอะไร

(คะแนนโบนัส: เพราะเหตุใดฉันจึงต้องลงชื่อแท็ก)

แก้ไข

ฉันเชื่อมั่นว่าแท็กที่มีคำอธิบายประกอบเป็นสิ่งที่ดี - รู้ว่าใครแท็กและเมื่อใดที่สำคัญ! ในการติดตามคำแนะนำใด ๆ เกี่ยวกับคำอธิบายประกอบแท็กที่ดี? ทั้งสองgit tag -am "tagging 1.0" 1.0และพยายามสรุปบันทึกการกระทำเนื่องจากแท็กก่อนหน้านี้รู้สึกเหมือนสูญเสียกลยุทธ์


คุณพบคำตอบที่ดีสำหรับการติดตามของคุณหรือไม่? สิ่งที่ต้องการ? git log --pretty=oneline master..HEAD | git tag -a -F - $BRANCH.$BUILD_NUMBER
dalore

การสรุปบันทึกการกระทำเนื่องจากแท็กก่อนหน้านี้ดูเหมือนว่าฉันจะชอบกลยุทธ์ที่ยอดเยี่ยมสำหรับข้อความแท็ก
rooby

FYI (1)สำหรับรายชื่อแท็กน้ำหนักเบาตามวันที่ไปที่นี่ (2)สำหรับรายชื่อแท็กข้อเขียนตามวันที่ไปที่นี่
Trevor Boyd Smith

คำตอบ:


272

ข้อดีของแท็กที่มีคำอธิบายประกอบคือคุณรู้ว่าใครเป็นผู้สร้าง เช่นเดียวกับการผูกมัดบางครั้งก็เป็นการดีที่รู้ว่าใครทำ หากคุณเป็นนักพัฒนาซอฟต์แวร์และคุณเห็นว่ามีการติดแท็ก v1.7.4 (พร้อมประกาศแล้ว) และคุณไม่แน่ใจคุณคุยกับใคร บุคคลที่มีชื่ออยู่ในแท็กหมายเหตุประกอบ! (หากคุณอาศัยอยู่ในโลกที่ไม่ไว้ใจสิ่งนี้จะทำให้ผู้คนไม่ต้องติดแท็กในสิ่งที่พวกเขาไม่ควรทำ) หากคุณเป็นผู้บริโภคชื่อนั้นคือตราประทับแห่งอำนาจ: นั่นคือ Junio ​​Hamano ที่กล่าวว่าคอมไพล์รุ่นนี้ การเผยแพร่.

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

แท็กการเซ็นชื่อนั้นค่อนข้างคล้ายกับการลงนามสิ่งอื่น - มันให้ความปลอดภัยอีกระดับหนึ่งสำหรับหวาดระแวง พวกเราส่วนใหญ่จะไม่เคยใช้มัน แต่ถ้าคุณต้องการตรวจสอบทุกอย่างก่อนที่จะใส่ซอฟต์แวร์นั้นในคอมพิวเตอร์ของคุณคุณอาจต้องการมัน

แก้ไข:

สำหรับสิ่งที่เขียนในคำอธิบายประกอบแท็กคุณพูดถูก - มีประโยชน์ไม่มากที่จะพูด สำหรับแท็กหมายเลขเวอร์ชันนั้นเป็นที่เข้าใจกันโดยชัดแจ้งว่าเป็นเครื่องหมายเวอร์ชันนั้นและหากคุณพอใจกับรายการเปลี่ยนแปลงที่อื่นคุณไม่จำเป็นต้องใส่แท็กหมายเลขนั้น ในกรณีนี้จริง ๆ แล้วตัวแท็กและวันที่สำคัญที่สุด สิ่งเดียวที่ฉันคิดได้ก็คือตราประทับการอนุมัติบางประเภทจากชุดทดสอบ ดูที่แท็กของ git.git: พวกเขาทั้งหมดพูดอะไรบางอย่างเช่น "Git 1.7.3 rc1"; สิ่งที่เราสนใจจริงๆคือชื่อของ Junio ​​Hamano

อย่างไรก็ตามสำหรับแท็กที่ตั้งชื่อไม่ชัดเจนข้อความอาจมีความสำคัญมากกว่า ฉันสามารถจินตนาการการติดแท็กเวอร์ชันวัตถุประสงค์พิเศษเฉพาะสำหรับผู้ใช้ / ลูกค้ารายเดียวเหตุการณ์สำคัญที่ไม่ใช่รุ่นสำคัญหรือ (ดังที่ได้กล่าวไว้ข้างต้น) ผู้สมัครรุ่นที่มีข้อมูลเพิ่มเติม ข้อความนั้นมีประโยชน์มากขึ้น


4
เพียงเพื่อเปรียบเทียบกับ SVN เนื่องจาก OP มาจากระบบนั้น: ข้อมูลเมตาของแท็กที่ทำหมายเหตุประกอบจะเทียบเท่ากับการเปลี่ยนแปลง SVN จริง the ทำให้สาขาของแท็กซึ่งใน SVN มีผู้เขียนและข้อความของตัวเอง และอาจแยกข้อ จำกัด ว่าใครสามารถสร้างแท็กแตกต่างจากผู้ที่สามารถตรวจสอบการเปลี่ยนแปลง - ความแตกต่างที่ไม่เกี่ยวข้องหากคุณเพียงแค่ใช้ระบบสำหรับสิ่งของของคุณเอง
araqnid

10
อ๋อ! ดูเหมือนความเข้าใจของฉันที่นี่ถูกขัดขวางโดยความจริงที่ว่าโครงการ Git ทั้งหมดของฉันจนถึงตอนนี้ยังเป็นโสด ฉันไม่เคยต้องการที่จะรู้ว่าใครจะตำหนิอะไรบางอย่าง (เป็นฉันเสมอ!) ดังนั้นฉันจึงไม่ได้สังเกตเห็นว่าแท็กที่มีน้ำหนักเบานั้นไม่ได้ติดตามตัวติดแท็ก
Ben Blank

5
git help logตอนนี้จะสรุปรวมเป็น: "แท็กหมายเหตุประกอบมีไว้สำหรับเผยแพร่ในขณะที่แท็กน้ำหนักเบามีไว้สำหรับป้ายชื่อส่วนตัวหรือวัตถุชั่วคราว"
Jon Gjengset

1
@javabrett ในขณะที่เป็นส่วนที่ดีของคำตอบของ "แท็กที่มีคำอธิบายประกอบและแท็กที่มีน้ำหนักเบา" คำตอบที่นี่เป็นคำถามที่เฉพาะเจาะจงว่าทำไมผู้คนถึงต้องการจัดเก็บข้อมูลเพิ่มเติมและใช้แท็กที่มีคำอธิบายประกอบ (และฉันไม่คิดว่าฉันจะพูดจริงจังว่า "มันสร้างหยด" เป็นข้อเสีย - คุณทำสิ่งที่คุณต้องทำเพื่อเก็บข้อมูลที่คุณต้องการจัดเก็บและถ้าเป็นข้อมูลที่สำคัญมันจะต้องมีหยด )
Cascabel

1
@ Chris ใช่ตามคำตอบว่า "ข้อดีของแท็กที่มีคำอธิบายประกอบคือคุณรู้ว่าใครเป็นผู้สร้างขึ้นมา" คุณสามารถลองทำสิ่งต่าง ๆ ด้วยตัวคุณเองเพื่อหาคำตอบ:git tag -a -m 'my message' my-tag; git show my-tag
Cascabel

64

มุมมองส่วนบุคคลของฉันแตกต่างกันเล็กน้อยในหัวข้อนั้น:

  • แท็กที่มีคำอธิบายประกอบเป็นแท็กเหล่านั้นที่มีไว้เพื่อเผยแพร่สำหรับนักพัฒนาคนอื่น ๆ ส่วนใหญ่อาจเป็นเวอร์ชั่นใหม่ (ซึ่งควรลงชื่อด้วย) ไม่เพียง แต่จะเห็นว่าใครติดแท็กและเมื่อถูกแท็ก แต่ยังทำไม (ปกติเปลี่ยน)
  • น้ำหนักเบาเหมาะสมสำหรับการใช้งานส่วนตัวมากกว่านั่นหมายถึงการติดแท็กการกระทำพิเศษเพื่อให้สามารถค้นหาได้อีกครั้ง ขอให้ลองตรวจสอบดูเพื่อทดสอบบางอย่างหรืออย่างอื่น

4
สิ่งนี้ถูกกล่าวถึงใน man git-tag: "แท็กหมายเหตุประกอบมีไว้เพื่อเผยแพร่ในขณะที่แท็กน้ำหนักเบามีไว้สำหรับป้ายชื่อวัตถุส่วนตัวหรือชั่วคราว": stackoverflow.com/a/35059291/895245
Ciro Santilli 郝海东冠状病病事件法轮功

28

โดยค่าเริ่มต้น Git เพียง git describeแต่ดูที่แท็กข้อเขียนเป็นพื้นฐานสำหรับคำสั่งเช่น คิดว่าแท็กที่มีคำอธิบายประกอบเป็นป้ายบอกทางที่มีความหมายที่ยั่งยืนสำหรับตัวคุณเองและคนอื่น ๆ ในขณะที่แท็กที่มีน้ำหนักเบาจะเป็นเหมือนบุ๊คมาร์คสำหรับค้นหาด้วยตนเองในภายหลัง ดังนั้นแท็กที่มีคำอธิบายประกอบจะมีมูลค่าการใช้เป็นข้อมูลอ้างอิงในขณะที่แท็กที่มีน้ำหนักเบาไม่ควรจะเป็น

การเซ็นชื่อแท็กคือการรับรองตัวตนของผู้ลงนาม มันช่วยให้ผู้ใช้ตรวจสอบตัวอย่างเช่นรหัสเคอร์เนล Linux ที่พวกเขาได้รับเป็นรหัสเดียวกับที่ Linus Torvalds เปิดตัวจริง ลายเซ็นอาจเป็นการยืนยันว่าผู้ลงนามรับรองคุณภาพและความสมบูรณ์ของซอฟต์แวร์ตามที่ตกลงไว้


1
git push --follow-tagsเป็นคำสั่งอื่นที่ปฏิบัติทั้งสองอย่างแตกต่างกัน: stackoverflow.com/a/26438076/895245
Ciro Santilli 郝海东冠状病病六四事件法轮功

1
git describeขอบคุณสำหรับคำแนะนำเกี่ยวกับ ฉันใช้มันในระบบการรวมอย่างต่อเนื่องและสองสามครั้งที่สตริงเวอร์ชันไม่ใช่สิ่งที่ฉันคาดหวัง
jjmontes

9

การลงชื่อแท็กเป็นวิธีที่ง่ายในการยืนยันความถูกต้องของการเปิดตัว

สิ่งนี้มีประโยชน์อย่างยิ่งใน DVCS เพราะทุกคนสามารถโคลนที่เก็บและแก้ไขประวัติ (เช่นผ่าน git-filter-branch) หากแท็กมีการเซ็นชื่อลายเซ็นจะไม่รอดการดำเนินการ git-filter-branch ดังนั้นหากคุณมีนโยบายที่ทุก ๆ การวางแท็กและลงนามโดยคอมมิทเตอร์มันเป็นไปได้ที่จะตรวจจับแท็กปล่อยปลอมในที่เก็บ

หากไม่ได้ลงนามฉันจะไม่เห็นจุดสำคัญในแท็กที่มีคำอธิบายประกอบ


1
ที่จริงแล้วมันอาจมีประโยชน์ที่จะมีลายเซ็นที่ลงนามในต้นไม้ที่ถูกจารึกไว้เท่านั้นไม่ใช่ประวัติศาสตร์ทั้งหมด (ฉันไม่สนใจว่าใครจะดัดแปลงประวัติใครสักคนฉันต้องการให้แน่ใจว่าฉันมีรหัสที่ถูกต้อง)
Paŭlo Ebermann

9

ผลักดันแท็กที่ใส่หมายเหตุประกอบไว้

พฤติกรรม Git บางอย่างมีความแตกต่างระหว่างพวกเขาด้วยวิธีที่คำแนะนำนี้มีประโยชน์เช่น:

  • แท็กที่ใส่หมายเหตุประกอบไว้สามารถมีข้อความผู้สร้างและวันที่ที่แตกต่างจากการคอมมิตที่ชี้ไป ดังนั้นคุณสามารถใช้มันเพื่ออธิบายการเปิดตัวได้โดยไม่ต้องทำการคอมมิท

    แท็กน้ำหนักเบาไม่มีข้อมูลเพิ่มเติมและไม่ต้องการเนื่องจากคุณจะใช้มันเพื่อพัฒนาตัวเองเท่านั้น

  • git push --follow-tagsจะผลักดันแท็กที่มีคำอธิบายประกอบเท่านั้น
  • git describe หากไม่มีตัวเลือกบรรทัดคำสั่งจะเห็นแท็กที่มีคำอธิบายประกอบเท่านั้น

man git-tag พูดว่า:

แท็กที่ทำหมายเหตุประกอบไว้สำหรับปล่อยในขณะที่แท็กที่มีน้ำหนักเบานั้นมีไว้สำหรับป้ายชื่อส่วนตัวหรือวัตถุชั่วคราว

ความแตกต่างภายใน

  • ทั้งแท็กที่มีน้ำหนักเบาและมีคำอธิบายประกอบเป็นไฟล์ภายใต้.git/refs/tagsที่ประกอบด้วย SHA-1

  • สำหรับแท็กที่มีน้ำหนักเบา SHA-1 จะชี้ไปที่การกระทำโดยตรง:

    git tag light
    cat .git/refs/tags/light
    

    พิมพ์เช่นเดียวกับ SHA-1 ของ HEAD

    จึงไม่น่าแปลกใจที่พวกเขาไม่สามารถมีข้อมูลเมตาอื่น ๆ

  • แท็กหมายเหตุประกอบชี้ไปที่วัตถุแท็กในฐานข้อมูลวัตถุ

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    มี SHA ของวัตถุแท็กหมายเหตุประกอบ:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    จากนั้นเราสามารถรับเนื้อหาด้วย:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    ตัวอย่างผลลัพธ์:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <your@mail.com> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    และนี่คือวิธีที่มีข้อมูลเมตาเพิ่มเติม ดังที่เราเห็นได้จากผลลัพธ์เขตข้อมูลเมตาคือ:

    การวิเคราะห์รายละเอียดเพิ่มเติมของรูปแบบมีอยู่ที่: รูปแบบของวัตถุแท็ก git คืออะไรและจะคำนวณ SHA ได้อย่างไร

โบนัส


6

ฉันพบการใช้แท็กที่มีน้ำหนักเบา - การสร้างรีลีสที่ GitHub อย่างย้อนหลัง

เราปล่อยซอฟต์แวร์ของเราแล้วและเรามีความมุ่งมั่นที่จำเป็นเราก็ไม่ได้สนใจที่จะรักษาส่วน 'Release' ใน GitHub และเมื่อเราให้ความสนใจเพียงเล็กน้อยเราก็ตระหนักว่าเราต้องการเพิ่มการเผยแพร่ก่อนหน้าบางรายการด้วยการแก้ไขวันที่เผยแพร่เก่าสำหรับพวกเขา

ถ้าเราจะสร้างแท็กที่มีคำอธิบายประกอบบนการคอมมิชชันเก่า GitHub จะใช้วันที่สำหรับการปล่อยจากวัตถุแท็ก ในทางตรงกันข้ามเมื่อเราสร้างแท็กที่มีน้ำหนักเบาสำหรับการส่งมอบเก่านี้การวางจำหน่ายเริ่มแสดงวันที่ที่ถูกต้อง (เก่า) วิธีใช้ Source @ GitHub 'เกี่ยวกับการเผยแพร่'

ดูเหมือนว่าคุณสามารถระบุวันที่ที่คุณต้องการสำหรับการส่งคำอธิบายประกอบได้ แต่มันก็ดูไม่ง่ายสำหรับฉัน: https://www.kernel.org/pub/software/scm/git/docs/git-tag HTML # _on_backdating_tags


แม้ว่าวันนี้ฉันจะพบว่า GitHub หยุดให้เกียรติกับวันที่แท็กสำหรับฉัน (สำหรับทั้งแท็กที่มีน้ำหนักเบาและมีคำอธิบายประกอบ) มันไม่สนใจวันที่เมื่อทำการเผยแพร่และแทนที่จะจดจำวันที่และเวลาเมื่อฉันกดปุ่ม "เผยแพร่" สำหรับการเปิดตัว
evilkos

ใช่ฉันยังสะดุดกับระเบียบนี้เกี่ยวกับ GitHub และแท็กคำอธิบายประกอบ ฉันไม่เข้าใจเลยว่าทำไมพวกเขาถึงใช้มันในแบบนี้ ..
YakovL

1

ในสำนักงานของฉันเราจะใส่ที่อยู่หน้าเว็บที่วางจำหน่ายไว้ในส่วนของแท็ก เว็บเพจที่วางจำหน่ายจะมีรายละเอียดเกี่ยวกับฟีเจอร์และการแก้ไขใหม่ทั้งหมดตั้งแต่รุ่นล่าสุด ผู้บริหารจะไม่มองหา repo คอมไพล์เพื่อค้นหาการเปลี่ยนแปลงที่เกิดขึ้นและเป็นเรื่องดีที่มีรายการย่อของสิ่งที่อยู่ในรีลีสนั้น


0

แท็กที่ทำหมายเหตุประกอบจะเก็บข้อมูลเมตาเพิ่มเติมเช่นชื่อผู้แต่งบันทึกประจำรุ่นแท็กข้อความและวันที่เป็นวัตถุแบบเต็มในฐานข้อมูล Git ข้อมูลทั้งหมดนี้มีความสำคัญต่อโครงการสาธารณะของคุณ

แท็ก git -a v1.0.0

แท็กที่มีน้ำหนักเบาเป็นวิธีที่ง่ายที่สุดในการเพิ่มแท็กในที่เก็บ git ของคุณเพราะจะเก็บเฉพาะแฮชของการคอมมิทที่อ้างถึงเท่านั้น พวกเขาสามารถทำตัวเหมือน "บุ๊กมาร์ก" เพื่อกระทำเช่นนั้นพวกเขายอดเยี่ยมสำหรับการใช้งานส่วนตัว

แท็ก git v1.0.0

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


0

สำหรับฉันความแตกต่างที่สำคัญคือแท็กที่มีน้ำหนักเบาไม่มีการประทับเวลา สมมติว่าคุณเพิ่มแท็กน้ำหนักเบาหลายแท็ก:

git tag v1
git tag v2
git tag v3

และหลังจากนั้นคุณอาจต้องการแท็กที่มีน้ำหนักเบาเพิ่มเข้ามาล่าสุด ไม่มีวิธีที่จะทำ ทั้ง "git อธิบาย" และ "แท็ก git" จะไม่ให้แท็กที่มีน้ำหนักเบาล่าสุดตามลำดับเวลา "git tag -l" สามารถส่งคืนทั้งหมดหรือเรียงลำดับตาม lex แต่ไม่ใช่ตามวันที่ / เวลา "git อธิบาย --tags" จะส่งคืน "v1" ซึ่งไม่ใช่แท็กที่เพิ่มล่าสุด

หากคุณเพิ่มแท็กหมายเหตุประกอบ:

git tag v1 -m v1
git tag v2 -m v1
git tag v3 -m v1

คุณจะได้รับการประทับเวลาของทุกแท็กและ "git อธิบาย" เสมอจะกลับมา "v3" ซึ่งเป็นแท็กที่เพิ่มล่าสุด


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