แท็ก git ถูกผลักเช่นกันหรือไม่?


190

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

มีปัญหาอะไรบ้าง


3
git push --follow-tagsตอนนี้สามารถเป็นประโยชน์ดูคำตอบของฉันด้านล่าง
VonC


1
เห็นด้วยกับสิ่งที่ซ้ำกัน: แม้ว่าสิ่งนี้จะเก่ากว่า แต่คำถามอื่น ๆ ก็ถูกวางไว้ดีกว่า
Ciro Santilli 郝海东冠状病六四事件法轮功

คำตอบ:


247

คุณสามารถทำได้:

git push --tags

27
ฉันค่อนข้างแน่ใจว่านั่นหมายความว่าการอ้างอิงส่วนหัวจะไม่ถูกผลักซึ่งหมายความว่าคุณจะผลักแท็กเท่านั้น
Dan Rosenstark

47
"ฉันไม่แนะนำให้ใช้หรือฝึกอบรมผู้อื่นให้ใช้git push --tagsเนื่องจากอาจเป็นการยากที่จะกำจัดแท็กที่ไม่ดีเมื่อเพื่อนร่วมงานของคุณได้รับการฝึกฝนให้กดแท็กทั้งหมดเนื่องจากผู้คนยังคงผลักแท็กเก่าที่มีอยู่ ต้องการผลักดันแท็กใหม่ด้วยเหตุนี้ฉันจึงขอแนะนำให้ทุกคนใช้git push origin <tag_name>ตอนนี้เท่านั้น " - คัดลอกจากstackoverflow.com/a/5195913/4130619
กิจกรรมลดขนาด

ฉันคิดว่าคำตอบอื่น ๆควรยอมรับstackoverflow.com/a/16164809/11635 แม้ว่าจะไม่ควรอ่านอย่างแน่นอน - มันให้ข้อดีและข้อเสียและในที่สุดคำตอบที่เป็นประโยชน์และถูกต้องมากขึ้นสำหรับวันนี้
Ruben Bartelink

140

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

$ git push <remote> tag <tagname>

เพื่อผลักดันแท็กเดียวหรือ

$ git push <remote> --tags

เพื่อผลักดันแท็กทั้งหมด (หรือgit push --tagsกดเพื่อรีโมตเริ่มต้นตามปกติorigin)

สิ่งนี้เป็นพฤติกรรมที่ตั้งใจไว้มาก การกดแท็กควรเป็นทางเลือกที่ใส่ใจ


สรุปสิ่งที่ Junio ​​C. Hamano เขียน (เชื่อมโยงในความคิดเห็นโดย @Andre Miras)

เมื่อดึงข้อมูลคุณกำลังโต้ตอบกับที่เก็บข้อมูลระยะไกลที่มีคนเผยแพร่ซึ่งหมายความว่า:

  1. ชุดแท็กที่มีอยู่มีผู้เผยแพร่ทั้งหมดต้องการให้คนดูและ
  2. ไม่เพียง แต่คุณเท่านั้น แต่คนอื่น ๆ จะเห็นแท็กเดียวกันด้วย

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

นั่นเป็นเหตุผลที่git fetchแท็ก "ติดตาม" โดยอัตโนมัตินั่นคือการดาวน์โหลดแท็กเมื่อดาวน์โหลดการแก้ไขที่ชี้ไปที่ - ในคำอื่น ๆ จะดาวน์โหลดแท็กที่เผยแพร่ที่เกี่ยวข้องทั้งหมด

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

นั่นเป็นเหตุผลที่คุณต้องกดแท็กอย่างชัดเจนเพื่อทำเครื่องหมายแท็กเป็นสาธารณะ


หรือคุณสามารถกำหนดค่ารีโมตที่คุณกดเพื่อผลักแท็กทั้งหมดได้เสมอเช่นใส่อะไรแบบนั้นลงใน.git/config:

[remote "เผยแพร่"] # หรือชื่ออื่น
    url = ...
    push = + refs / heads / *: refs / heads / *
    push = + refs / tags / *: refs / tags / *

ซึ่งหมายความว่าบังคับให้กดหัวทั้งหมด (ทุกสาขา) และแท็กทั้งหมด (ถ้าคุณไม่ต้องการบังคับให้กดหัวให้นำ '+' คำนำหน้าออกจาก refspec)


สิ่งนี้ไม่ได้เป็น 'แรงผลักดัน' ของหัวทั้งหมดหรือไม่
Stefan Näwe

@tefan: ใช่มัน Updated
Jakub Narębski

19
"นี่เป็นพฤติกรรมที่ตั้งใจทำมากเพื่อให้การกดแท็กชัดเจนการกดแท็กควรเป็นทางเลือกที่ใส่ใจ" ฉันไม่เข้าใจเหตุผล คุณช่วยอธิบายเพิ่มเติมได้หรือไม่ว่าทำไม Git ถึงกดแท็กโดยอัตโนมัติ
Ryan Lundy

13
@Kyralessaในโพสต์นี้git.661346.n2.nabble.com/… , Junio ​​C Hamano (ผู้ดูแลระบบปัจจุบันของ Git) อธิบายว่าทำไมการกดแท็กโดยอัตโนมัติจึงเป็นเรื่องที่ไม่ดี
Andre Miras

@AndreMiras ขอบคุณสำหรับลิงค์ที่น่าประทับใจนี้ คงจะดีถ้าเราสามารถรวมโพสต์ของ Junio ​​เข้ากับคำตอบนี้ได้
Homer6

67

โปรดทราบว่าตั้งแต่git 1.8.3 (22 เมษายน 2013)คุณไม่จำเป็นต้องทำ 2 คำสั่งในการพุชกิ่งและกดแท็ก:

ใหม่ " --follow-tagsตัวเลือก" บอก " git push" เพื่อผลักดันแท็กข้อเขียนที่เกี่ยวข้องเมื่อผลักดันสาขาออก

คุณสามารถลองได้แล้วเมื่อกดคอมมิทใหม่:

git push --follow-tags

ว่าจะไม่ผลักดันทุกแท็กท้องถิ่น แต่เพียงข้อเขียนgit pushคนอ้างอิงโดยกระทำซึ่งจะผลักดันให้กับ


สิ่งนี้ได้ถูกนำมาใช้ในการคอมมิชชัน c2aba15โดยJunio ​​C Hamano ( gitster) :

ตัวเลือกใหม่ " --follow-tags" บอก " git push" เพื่อผลักดันแท็กที่มีคำอธิบายประกอบที่หายไปจากอีกด้านหนึ่งและสามารถเข้าถึงได้โดยประวัติที่ถูกผลักออกมา

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


การกำหนดค่าpush.followTagsอนุญาตให้รวม--follow-tagsโดยค่าเริ่มต้น (Git 2.4.1+, Q2 2015) ดู " กดคอมไพล์และแท็กพร้อมกัน "


3
สิ่งนี้จะผลักดันแท็กที่มีคำอธิบายประกอบทั้งหมดเท่านั้น คน / โครงการส่วนใหญ่ใช้แท็กที่มีน้ำหนักเบา ดังนั้นในกรณีส่วนใหญ่git push --follow-tagsไม่ได้ผลักดันมากไปกว่าgit push
Jarl

3
@Jarl ใช่ฉันได้พูดถึง "คำอธิบายประกอบ" ในคำตอบของฉัน แต่ฉันได้ใช้แท็กที่มีคำอธิบายประกอบจริงๆแล้วการจองแท็กที่มีน้ำหนักเบาสำหรับการใช้งานภายในอย่างหมดจด
VonC

@VonC: ขณะนี้ยังมีตัวเลือกการกำหนดค่าที่ทำให้เป็นค่าเริ่มต้นตามที่คุณบันทึกไว้ที่นี่: stackoverflow.com/a/3745250/946850
krlmlr

19

สิ่งที่ฉันมักจะทำคือ:

[remote "เผยแพร่"] # หรือชื่ออื่น
    url = ...
    push =:
    push = + refs / tags / *: refs / tags / *

หมายความว่ามันดันทุกสาขาที่มีอยู่แล้วพร้อมแท็ก มันไม่ได้บังคับให้ดันและมันก็ไม่ได้ผลักสาขาที่คุณไม่ได้กดด้วยตนเอง


ฉันสามารถใส่ในการกำหนดค่า git ทั่วโลกของผู้ใช้ของฉันได้หรือไม่? ถ้าใช่เป็นอย่างไร ขอบคุณ! :)
gucki

ดูเหมือนว่าคุณกำลังบังคับแท็ก แต่ไม่ใช่สาขา
Adrian Ratnapala

ใช่แล้วและไม่ใช่ฉันเขียนว่ามันจะผลักแท็กใหม่มันจะไม่บังคับผลักพวกเขาและมันจะไม่ผลักสาขาที่คุณยังไม่ได้ผลัก
เสื่อ

ฉันลองทำตามคำแนะนำของจาคุบ แต่มันผลักดันกิ่งไม้ที่ฉันต้องการเฉพาะที่ คำแนะนำนี้ปูทำงานได้สมบูรณ์แบบ มันจะซิงค์แท็ก แต่จะไม่ซิงค์สาขาเว้นแต่พวกเขาจะเป็นสาขาการติดตามระยะไกล (เช่นจะไม่ส่งสาขาใหม่ไปที่รีโมต แต่จะอัปเดตหากพวกเขาอยู่ในรีโมตแล้ว) หมายเหตุ: หากคุณมีแท็กและสาขาที่มีชื่อเดียวกันคุณจะได้รับข้อผิดพลาด "ตรงกันมากกว่าหนึ่งรายการ" อ้างถึงlostechies.com/jasonmeridth/2010/02/27/refspec-matches-more-than-one/
josephdpurcell

5

และหากคุณต้องการดึงแท็กทั้งหมดคุณสามารถตั้งค่าในการกำหนดค่าโดย:

git config remote.origin.tagopt --tags

จากเอกสาร:

การตั้งค่านี้เป็น - no-tags ปิดใช้งานแท็กอัตโนมัติต่อไปนี้เมื่อดึงข้อมูลจากระยะไกล การตั้งค่าเป็น - แท็กจะดึงทุกแท็กจากระยะไกลแม้ว่าจะไม่สามารถเข้าถึงได้จากส่วนหัวสาขาระยะไกล ผ่านการตั้งค่าสถานะเหล่านี้โดยตรงเพื่อ git-fetch (1) สามารถแทนที่การตั้งค่านี้ ดูตัวเลือก - แท็กและ - ไม่มีแท็กของ git-fetch (1)


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