แก้ไข, 24 พ.ย. 2559: คำตอบนี้เห็นได้ชัดว่าเป็นที่นิยมดังนั้นฉันจึงเพิ่มบันทึกย่อที่นี่ หากคุณเปลี่ยนแท็กบนเซิร์ฟเวอร์กลางทุกคนที่มีเก่าแท็กใด ๆ โคลนของที่เก็บข้อมูลกลางเซิร์ฟเวอร์ที่มีอยู่แล้วมีแท็กสามารถรักษาแท็กเก่า ดังนั้นในขณะนี้จะบอกวิธีการทำมันให้แน่ใจว่าคุณต้องการที่จะทำ คุณจะต้องได้รับทุกคนที่แล้วมีแท็ก "ผิด" เพื่อลบของพวกเขา "ผิดแท็ก" และแทนที่ด้วยใหม่ "แท็กขวา"
การทดสอบใน Git 2.10 / 2.11 แสดงให้เห็นว่าการรักษาแท็กเก่าเป็นพฤติกรรมปกติสำหรับลูกค้าที่ทำงานและปรับปรุงเป็นพฤติกรรมปกติสำหรับลูกค้าที่ทำงานgit fetch
git fetch --tags
(คำตอบดั้งเดิมมีดังนี้)
เมื่อคุณขอแท็กดันgit push --tags
ส่ง (พร้อมกับกระทำใด ๆ และวัตถุอื่น ๆ ที่จำเป็นและการปรับปรุงเตะอื่น ๆ จากการตั้งค่าการผลักดัน) เพื่อระยะไกลร้องขอการปรับปรุงรูปแบบ (มันส่งได้มาก: หนึ่งอันสำหรับแต่ละแท็ก)new-sha1 refs/tags/name
รีโมตคำร้องขอถูกแก้ไขโดยรีโมตเพื่อเพิ่ม old-sha1
(หรืออีกครั้งหนึ่งสำหรับแต่ละแท็ก) จากนั้นส่งไปยังการรับล่วงหน้าและ / หรือการอัพเดตฮุค hooks เหล่านั้นสามารถตัดสินใจว่าจะอนุญาตหรือปฏิเสธแท็กสร้าง / ลบ / อัปเดต
old-sha1
ค่าเป็นทุกศูนย์ "null" SHA-1 หากแท็กจะถูกสร้างขึ้น new-sha1
เป็นโมฆะ SHA-1 หากแท็กจะถูกลบ มิฉะนั้นค่า SHA-1 ทั้งคู่จะเป็นค่าจริงและถูกต้อง
แม้ว่าจะไม่มี hooks แต่ก็มี "hook ในตัว" ที่เรียกใช้เช่นกัน: รีโมตจะปฏิเสธที่จะย้ายแท็กจนกว่าคุณจะใช้สถานะ "บังคับ" (แม้ว่า "hook ในตัว" จะใช้ได้เสมอกับทั้งคู่ "เพิ่ม" และ "ลบ") ข้อความปฏิเสธที่คุณเห็นมาจากเบ็ดในตัวนี้ (บังเอิญตะขอในตัวเดียวกันนี้ยังปฏิเสธการอัปเดตสาขาที่ไม่ใช่การส่งต่อที่รวดเร็ว) 1
แต่ - นี่คือกุญแจหนึ่งในการทำความเข้าใจว่าเกิดอะไรขึ้น - git push
ขั้นตอนนี้ไม่ทราบว่ารีโมตมีแท็กนั้นหรือไม่และถ้าเป็นเช่นนั้น SHA-1 จะมีมูลค่าเท่าใด มีเพียงบอกว่า "นี่คือรายการแท็กที่สมบูรณ์ของฉันพร้อมกับค่า SHA-1" รีโมตจะเปรียบเทียบค่าและหากมีส่วนเพิ่มเติมและ / หรือการเปลี่ยนแปลงให้รัน hooks ที่ค่าเหล่านั้น (สำหรับแท็กที่เหมือนกันมันไม่ได้ทำอะไรเลยสำหรับแท็กที่คุณไม่มีพวกมันก็ไม่ทำอะไรเลย!)
หากคุณลบแท็กในเครื่องแล้วการpush
กดของคุณจะไม่ถ่ายโอนแท็ก รีโมตถือว่าไม่มีการเปลี่ยนแปลง
หากคุณลบแท็กในเครื่องจากนั้นสร้างแท็กที่ชี้ไปยังสถานที่ใหม่จากนั้นการpush
พุชของคุณจะโอนแท็กและรีโมตจะเห็นสิ่งนี้ว่าเป็นการเปลี่ยนแท็กและปฏิเสธการเปลี่ยนแปลงเว้นแต่เป็นแรงผลักดัน
ดังนั้นคุณมีสองตัวเลือก:
- ทำแรงกดหรือ
- ลบแท็กบนรีโมท
หลังสามารถทำได้ผ่านgit push
2แม้ว่าการลบแท็กในเครื่องและpush
ไม่มีผล สมมติว่าชื่อของรีโมทคือorigin
และแท็กที่คุณต้องการลบคือdev
:
git push origin :refs/tags/dev
สิ่งนี้ขอให้รีโมตลบแท็ก การมีหรือไม่มีแท็กdev
ในที่เก็บโลคัลของคุณไม่เกี่ยวข้อง ประเภทนี้ที่push
มีการอ้างอิงเป็นการกดลบอย่างแท้จริง:remoteref
ระยะไกลอาจหรือไม่อนุญาตให้ลบแท็ก (ขึ้นอยู่กับ hooks พิเศษใด ๆ ที่เพิ่ม) หากอนุญาตให้ลบได้แท็กจะหายไปและอีกหนึ่งวินาทีgit push --tags
เมื่อคุณมีdev
แท็กโลคัลที่ชี้ไปยังวัตถุ repo แท็กการคอมมิตหรือหมายเหตุประกอบให้ส่งdev
แท็กใหม่ของคุณ บนรีโมตในdev
ตอนนี้จะเป็นแท็กที่สร้างขึ้นใหม่ดังนั้นรีโมตอาจยอมให้กดได้ (อีกครั้งจะขึ้นอยู่กับการเพิ่ม hooks พิเศษใด ๆ )
แรงกดง่ายกว่า หากคุณต้องการให้แน่ใจว่าจะไม่อัปเดตสิ่งอื่นใดนอกเหนือจากแท็กเพียงบอกgit push
ให้ผลักดันเพียงหนึ่งที่อ้างอิง:
git push --force origin refs/tags/dev:refs/tags/dev
(หมายเหตุ: คุณไม่จำเป็นต้องใช้--tags
ถ้าหากคุณต้องการระบุเพียงหนึ่งแท็ก)
1แน่นอนเหตุผลของเบ็ดในตัวนี้คือการช่วยบังคับใช้พฤติกรรมที่ผู้ใช้รายอื่นของรีโมต repo เดียวกันนั้นคาดหวัง: สาขานั้นจะไม่กรอทและแท็กจะไม่เคลื่อนที่ หากคุณบังคับให้คุณควรแจ้งให้ผู้ใช้รายอื่นทราบว่าคุณกำลังทำสิ่งนี้อยู่เพื่อให้พวกเขาสามารถแก้ไขได้ โปรดทราบว่า "Git 1.8.2" ไม่ได้ย้ายแท็กเลย " เวอร์ชันก่อนหน้าจะอนุญาตให้แท็ก "ก้าวไปข้างหน้า" ในกราฟการกระทำเหมือนกับชื่อสาขา ดูบันทึกประจำรุ่น 1.8.2 คอมไพล์
2มันไม่สำคัญถ้าคุณสามารถลงชื่อเข้าใช้ทางไกลได้ เพียงไปที่ที่เก็บ Git และเรียกใช้git tag -d dev
และมีการวิ่ง โปรดทราบว่าวิธีใดวิธีหนึ่ง - การลบแท็กบนรีโมตหรือใช้git push
เพื่อลบแท็ก- มีช่วงเวลาที่ทุกคนที่เข้าถึงรีโมตจะพบว่าdev
แท็กนั้นหายไป (พวกเขาจะยังคงมีของตัวเองแท็กเก่าถ้าพวกเขามีอยู่แล้วมันและพวกเขาก็อาจจะผลักดันให้พวกเขากลับมาแท็กเก่าขึ้นก่อนที่คุณจะสามารถผลักดันหนึ่งใหม่.)