คุณจะผลักดันแท็ก Git ไปยังสาขาโดยใช้ refspec ได้อย่างไร


216

ฉันต้องการบังคับให้กดเช่นแท็ก1.0.0ของฉันไปยังmasterสาขาระยะไกลของฉัน

ตอนนี้ฉันทำสิ่งต่อไปนี้:

git push production +1.0.0:master

ฉันต้องการบังคับให้กดเนื่องจากสิ่งที่ฉันสนใจคือรหัสภายใน1.0.0แท็กจะถูกผลักไปยังmasterสาขาบนที่เก็บระยะไกล

ผมทำอะไรผิดหรือเปล่า?

อัปเดต # 1

เมื่อฉัน SSH ลงในเซิร์ฟเวอร์ของฉันที่ที่เก็บGitของฉันเป็นและดำเนินการgit branch -lฉันไม่เห็นmasterสาขาที่ระบุไว้เช่นกัน

อัปเดต # 2

หลังจากทำงานgit tag -lจากภายในที่เก็บ Git ระยะไกลฉันเห็นว่าmasterมีอยู่ในรายการซึ่งหมายความว่าเมื่อฉันวิ่งต่อไปนี้:

git push production 1.0.0:master

มันจริงผลักดันแท็กและสร้างแท็กชื่อ masterมากกว่าสาขาใหม่

ฉันต้องการผลักเนื้อหาของแท็ก1.0.0ลงในmasterสาขาของที่เก็บ Git ระยะไกล


คุณช่วยอธิบายได้ไหมว่า "ไม่ทำงาน" หมายถึงอะไร Git ให้ข้อผิดพลาดเฉพาะหรือมีผลเป็นโมฆะหรือไม่?
vcsjones

ฉันขอโทษ. ใช่ดังนั้นโดยทั่วไปเมื่อฉัน SSH ลงในเซิร์ฟเวอร์ของฉันลงในที่เก็บ git และเรียกใช้git branch -lเพื่อแสดงรายการสาขาฉันเห็นเฉพาะสาขาอื่น ๆ ของฉัน อย่างไรก็ตามการผลิต git push +1.0.0: masterผลักออกไปเมื่อฉันกดอีกครั้งจะแจ้งว่าทุกอย่างทันสมัยแต่ฉันไม่เห็นสาขาหลักบนเซิร์ฟเวอร์ระยะไกล
Michael van Rooijen

5
คุณควรเปลี่ยนคำตอบที่ยอมรับได้ คำตอบที่สองนั้นง่ายกว่าคำตอบที่ได้รับการยอมรับ
Pedro Rolo

ขอโทษที่ตอบช้า. ฉันเห็นด้วยและตอนนี้เปลี่ยนคำตอบที่ยอมรับแล้ว
Michael van Rooijen

1
@MichaelvanRooijen ฉันไม่เข้าใจว่าคำตอบที่ยอมรับซึ่งคุณเลือกแก้ปัญหานี้ได้อย่างไร มันไม่ได้เขียนทับสาขาที่มีแท็ก แต่มันก็ผลักแท็กของคุณไปยังระยะไกล

คำตอบ:


61

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

ข้อผิดพลาด: พยายามเขียนวัตถุที่ไม่ได้ส่งไปยัง refs / heads / master

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

git push production +1.0.0^{commit}:master
git push production +1.0.0~0:master          # shorthand

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

git push production +1.0.0^{}:master

แท็กเหล่านี้ลอกไวยากรณ์ที่อธิบายไว้ในGit-REV-แจง (1)ภายใต้การปรับการระบุ


1
วิธีนี้แก้ปัญหาได้! อย่างไรก็ตามสาขาหลักจำเป็นต้องมีอยู่แล้ว นี่ไม่ใช่ปัญหาของฉัน ขอบคุณมาก ๆ สำหรับความช่วยเหลือของคุณ!
Michael van Rooijen

2
@Michael: Ahh ใช่ถ้าต้นแบบไม่มีอยู่ (เป็นสาขาหรือแท็ก) จากนั้นgit push rep +tag:masterจะสร้างแท็กชื่อต้นแบบแทนสาขา git push rep +tag~0:master(อีกครั้งเมื่อไม่มีต้นแบบเป็นสาขาหรือแท็ก) จะล้มเหลวด้วย“ ข้อผิดพลาด: ไม่สามารถผลักดันไปยังปลายทางที่ไม่ผ่านการรับรอง” คำสั่งที่จะได้ทำสิ่งที่คุณต้องการ (ก่อนที่โทสาขา / แท็กที่มีอยู่) คือgit push rep +tag~0:refs/heads/master( refs/heads/เป็น namespace ตามที่สาขาจะถูกเก็บไว้)
Chris Johnsen

ที่ดี! นั่นจะช่วยให้ฉันออกมาดีอย่างน่าอัศจรรย์ สะดวกมาก! ขอบคุณมากสำหรับการโพสต์ข้อมูลเช่นกัน
Michael van Rooijen

4
@brad: ~{commit}ไวยากรณ์เป็นตัวอักษร (เช่นอักขระเก้าตัวนั้นเสมอ); คำcommitไม่ใช่ตัวยึดตำแหน่งที่นี่
Chris Johnsen

1
อาโอเค! ขอโทษฉันคิดว่าคุณหมายถึงการกระทำที่เฉพาะเจาะจงทำให้รู้สึกมากขึ้นในขณะนี้
แบรด

469
git push --tags production

4
git push production :1.0.0หากแท็กที่มีอยู่แล้วในระยะไกลที่คุณจะต้องลบแท็กระยะไกลครั้งแรกกับ
respectTheCode

1
หากในโอกาสใด ๆ คุณจะมีสาขาที่มีชื่อเดียวกัน: '1.0.0' การกดนี้จะล้มเหลวในการใช้งานที่ดีกว่า: git push production :refs/tags/1.0.0การลบแท็กเท่านั้น
Vladimir

1
@Nerian: ฉันคิดว่ามันแค่กดแท็ก
bstpierre

5
สิ่งนี้จะช่วยแก้ปัญหาโปสเตอร์ต้นฉบับเกี่ยวกับการเขียนทับสาขาด้วยแท็กโดยบังคับให้กดได้อย่างไร เพียงแค่ผลักแท็กทั้งหมดของคุณไปยังรีโมตแท็กจะไม่เขียนทับกิ่งไม้ใด ๆ

1
ไม่ใช่คำถามที่ถามวิธีผลักแท็กหนึ่งแท็กใช่หรือไม่ คำสั่งนี้ทำมากกว่านั้นทั้งหมด
Chris Martin

61

ฉันสร้างแท็กเช่นนี้แล้วฉันผลักมันไปที่ GitHub:

git tag -a v1.1 -m "Version 1.1 is waiting for review"
git push --tags

Counting objects: 1, done.
Writing objects: 100% (1/1), 180 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:neoneye/triangle_draw.git
 * [new tag]         v1.1 -> v1.1

4
มันผลักดันแท็กทั้งหมดของคุณ
Dawid Drozd

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

10

สำหรับการผลักดันแท็กเดียว: git push <reponame> <tagname>

ตัวอย่างเช่น git push production 1.0.0ยกตัวอย่างเช่นแท็กไม่ได้ถูกผูกไว้กับสาขา แต่ถูกผูกไว้กับการผูกมัด

เมื่อคุณต้องการมีเนื้อหาของแท็กในสาขาหลักให้ทำแบบนั้นในเครื่องของคุณ ฉันจะสมมติว่าคุณพัฒนาอย่างต่อเนื่องในสาขาหลักของคุณ จากนั้นก็git push origin masterควรจะพอเพียง


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