ทำไม git push gerrit HEAD: refs / for / master ใช้แทน git push master origin


148

ฉันเพิ่งเริ่มใช้ gerrit และฉันต้องการทราบว่าทำไมเราต้องทำgit push gerrit HEAD:refs/for/masterแทนที่จะทำgit push origin master

ถ้าฉันทำgit push origin masterฉันได้รับข้อผิดพลาดที่บอกว่า! [remote rejected] master -> master (prohibited by Gerrit)

คำตอบ:


259

เอกสารสำหรับ Gerrit โดยเฉพาะอย่างยิ่งในส่วน"การเปลี่ยนแปลงแบบพุช"อธิบายว่าคุณกดไปที่ "การrefs/for/'branch'อ้างอิงมหัศจรรย์โดยใช้เครื่องมือไคลเอนต์ Git ใด ๆ "

ภาพต่อไปนี้จะนำมาจากบทนำเพื่อ Gerrit เมื่อคุณกดเพื่อ Gerrit git push gerrit HEAD:refs/for/<BRANCH>คุณทำ สิ่งนี้จะผลักดันการเปลี่ยนแปลงของคุณไปยังพื้นที่การแสดงละคร (ในแผนภาพ "การเปลี่ยนแปลงที่รอดำเนินการ") Gerrit ไม่มีสาขาชื่อ<BRANCH>จริง มันอยู่ที่ลูกค้า git

ภายใน Gerrit มีการใช้งานของตัวเองสำหรับกอง Git และ SSH วิธีนี้ช่วยให้สามารถให้การrefs/for/<BRANCH>อ้างอิงที่"วิเศษ"

เมื่อได้รับคำขอพุชเพื่อสร้างการอ้างอิงหนึ่งในเนมสเปซเหล่านี้ Gerrit ดำเนินการตรรกะของตัวเองเพื่ออัปเดตฐานข้อมูลจากนั้นจะอยู่ที่ไคลเอ็นต์เกี่ยวกับผลลัพธ์ของการดำเนินการ ผลลัพธ์ที่ประสบความสำเร็จทำให้ลูกค้าเชื่อว่า Gerrit ได้สร้างการอ้างอิง แต่ในความเป็นจริงแล้ว Gerrit ไม่ได้สร้างการอ้างอิงเลย [ ลิงก์ - Gerrit "รายละเอียด Gritty" ]

กระบวนการทำงานของ Gerrit

หลังจากแพทช์ที่ประสบความสำเร็จ (เช่นแพทช์ถูกส่งไปยัง Gerrit, [วางลงในพื้นที่จัดเตรียม "รอการเปลี่ยนแปลง", ตรวจสอบ, และผ่านการตรวจสอบแล้ว), Gerrit ผลักดันการเปลี่ยนแปลงจาก "รอการเปลี่ยนแปลง" ลงใน " เผด็จการ Repository" refs/for/<BRANCH>การคำนวณซึ่งสาขาที่จะผลักดันมันเข้าไปอยู่บนพื้นฐานของความมหัศจรรย์มันได้เมื่อคุณผลักดันให้ Authoritative Repositoryวิธีนี้แพทช์การตรวจสอบเรียบร้อยแล้วสามารถดึงโดยตรงจากสาขาที่ถูกต้องของ


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

1
@Polarolaranja ฉันทำแบบเดียวกันโดยบังเอิญ คุณพูดถูก Gerrit "จัดการ" สถานการณ์ดังกล่าว แต่ไม่ได้สร้างการเปลี่ยนแปลงใด ๆ ดังนั้นจริง ๆ แล้วมันไม่ได้จัดการเลย ซึ่งทำให้ฉันโกรธจริงๆเพราะนี่มันช่างโง่จริงๆ เหตุใดจึงอนุญาตให้ผู้ใช้ยืนยันบางสิ่ง Gerrit นั้นไม่สามารถจัดการได้อย่างเหมาะสม
trejder

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

5
@trejder อนุญาตให้ใช้เพราะ Gerrit อนุญาตให้คุณกำหนดค่าบัญชีบางอย่างเพื่อหลีกเลี่ยงความเห็น ด้วยการกดไปที่สาขาเริ่มต้นคุณจะพูดอย่างมีประสิทธิภาพว่า "ฉันต้องการรวมการเปลี่ยนแปลงนี้โดยไม่ต้องมีการตรวจทาน" หากคุณไม่ได้รับอนุญาตให้ทำเช่นนั้นการกดจะล้มเหลว
Hounshell

4
หรือคุณไม่สามารถใช้ gerrit และหลีกเลี่ยงความวุ่นวายนี้ได้ทั้งหมด
C Johnson

57

เพื่อหลีกเลี่ยงการต้องระบุคำสั่ง git push อย่างครบถ้วนคุณสามารถแก้ไขไฟล์ git config ของคุณ:

[remote "gerrit"]
    url = https://your.gerrit.repo:44444/repo
    fetch = +refs/heads/master:refs/remotes/origin/master
    push = refs/heads/master:refs/for/master

ตอนนี้คุณสามารถ:

git fetch gerrit
git push gerrit

นี่เป็นไปตามGerrit


1
+1 จากฉัน! มันเป็นวิธีที่ดีกว่าที่จะมีรหัสนี้สำหรับฉันremote.origin.pushแทนที่จะต้องพิมพ์ / วางทุกครั้ง!
DaoWen

7
@SeanMurphy คุณสามารถทำให้เป็นเรื่องทั่วไปมากขึ้นโดยการแทนที่อินสแตนซ์ของ 'master' ด้วย '*' เพื่อให้บางอย่างเช่น 'git push gerrit TopicBranch' ทำงานได้เช่นกัน
David Doria

นอกจากนี้หาก gerrit เป็นรีโมทเดียวของคุณคุณไม่จำเป็นต้องระบุเลย ฉันเพียงแค่ทำgit fetchและgit pushด้วย config @DavidDoria ที่กล่าวถึงข้างต้น
bernk

push = refs / heads / *: refs / for / * สำหรับทุกสาขา
Victor Choy

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