วิธีการดึงหลายสาขาพร้อมกันด้วยคอมไพล์?


13

ใน repo ฉันมีหลายสาขาในหมู่พวกเขา "ต้นแบบ" และ "พัฒนา" ซึ่งถูกตั้งค่าให้ติดตามสาขาระยะไกล "ต้นกำเนิด / ต้นแบบ" และ "ต้นกำเนิด / พัฒนา"

เป็นไปได้หรือไม่ที่จะระบุว่าฉันต้องการให้ทั้งต้นแบบและพัฒนาถูกรวมเข้าด้วยกัน (ส่งต่ออย่างรวดเร็ว) ในครั้งเดียวหรือไม่

เมื่อฉันทำgit pullตอนนี้ฉันได้รับสิ่งนี้:

remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
   5386563..902fb45  develop    -> origin/develop
   d637d67..ba81fb2  master     -> origin/master
Updating 5386563..902fb45
Fast-forward

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

ดังนั้นฉันต้องทำgit checkout master...

Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.

... และจากนั้นgit pullอีกครั้งจากนั้นสลับกลับไปยังการพัฒนาเพื่อให้ได้ผลลัพธ์ที่ต้องการ

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


ฉันพยายามgit pull origin refs/heads/develop:refs/remotes/origin/develop refs/heads/master:refs/remotes/origin/masterแต่ที่ก่อให้เกิดต้นแบบระยะไกลที่จะผสานเข้ากับการพัฒนา ..
Superole

1
ทำไมมันจะเกิดข้อผิดพลาดได้ง่ายหรือไม่มีประสิทธิภาพ? Git ตั้งใจจะปรับแต่งเช่นนี้ BTW, เพื่อหลีกเลี่ยงการตรวจสอบแต่ละสาขาคุณอาจต้องการที่จะแยกคุณpullเป็นfetchตามด้วยการmergeลงไปในแต่ละสาขา
jjlin

@jjlin ดีถ้าฉันสามารถทำได้โดยไม่ต้องตรวจสอบแต่ละสาขาที่อาจช่วยในประสิทธิภาพ มันเป็นข้อผิดพลาดได้ง่ายเนื่องจากเมทริกซ์ของสิ่งต่าง ๆ ที่ผิดพลาดและผลกระทบที่มีต่อส่วนที่เหลือของสคริปต์นั้นค่อนข้างซับซ้อน ฉันไม่ได้บอกว่ามันเป็นไปไม่ได้ที่จะทำให้ปลอดภัย แต่มันจะเป็นการแลกเปลี่ยน ดังนั้นผมจึงต้องการแก้ปัญหาในตัวถ้ามันมีอยู่ :)
Superole

คำตอบ:


11

คุณสามารถตั้งค่านามแฝงที่ใช้git fetchกับ refspec เพื่อรวมสาขาของคุณอย่างรวดเร็วด้วยคำสั่งเดียว ตั้งค่าเป็นนามแฝงใน.gitconfigไฟล์ผู้ใช้ของคุณ:

[alias]
    sync = "!sh -c 'git checkout --quiet --detach HEAD && \
                    git fetch origin master:master develop:develop ; \
                    git checkout --quiet -'"

การใช้งาน: git sync.

นี่คือสาเหตุที่ใช้งานได้:

  1. git checkout --quiet HEADตรวจสอบการกระทำปัจจุบันของคุณโดยตรงนำคุณเข้าสู่สถานะผู้นำเดี่ยว ด้วยวิธีนี้หากคุณอยู่masterหรือdevelopคุณถอดสำเนาการทำงานของคุณออกจากตัวชี้สาขาเหล่านั้นทำให้สามารถย้ายได้ (Git จะไม่อนุญาตให้คุณย้ายการอ้างอิงสาขาในขณะที่สำเนาการทำงานของคุณได้ตรวจสอบแล้ว)

  2. git fetch origin master:master develop:developใช้ refspecs ด้วยfetchเพื่อกรอไปข้างหน้าmasterและdevelopสาขาใน repo ท้องถิ่นของคุณ โดยทั่วไปไวยากรณ์จะบอก Git "นี่คือการอ้างอิงของฟอร์ม<source>:<destination>ใช้<destination>และส่งต่ออย่างรวดเร็วไปยังจุดเดียวกับ<source>" ดังนั้นแหล่งที่มาในนามแฝงจึงเป็นสาขาจากoriginในขณะที่ปลายทางเป็นรุ่น repo ท้องถิ่นของสาขาเหล่านั้น

  3. ในที่สุดgit checkout --quiet -ตรวจสอบสาขาที่คุณใช้ล่าสุดโดยไม่คำนึงว่ามีความล้มเหลวในคำสั่งก่อนหน้านี้หรือไม่ ดังนั้นถ้าคุณอยู่ในmasterเมื่อคุณวิ่งและทุกอย่างประสบความสำเร็จคุณจะออกจากรัฐหัวเดี่ยวและตรวจสอบปรับปรุงใหม่git syncmaster

ดูคำตอบของฉันที่มีต่อ git: อัพเดทสาขาในท้องที่โดยไม่ต้องเช็คเอาท์? .


ฉันไม่เข้าใจเวทมนต์เดี่ยวที่นี่ทำไมตัวชี้ไปที่ต้นแบบไม่สามารถถูกย้ายได้เมื่อพัฒนาออกแล้ว ... ต่อไปฉันลองและดูเหมือนว่าจะทำงานยกเว้นตอนนี้ฉันได้รับ "สาขาของคุณอยู่ข้างหน้า 'กำเนิด / พัฒนา' โดย 1 คอมมิชชัน"
Superole

... ซึ่งแก้ไขได้ในครั้งต่อไปที่ฉันดึง
Superole

@ Superole ซึ่งเป็นสาขาใดก่อนorigin/developเมื่อคุณใช้นามแฝง? มันคงไม่สมเหตุสมผลถ้าเป็นdevelopสาขาของคุณ นอกจากนี้ตัวชี้สำหรับmaster สามารถเคลื่อนย้ายได้หากเป็นdevelopที่ชำระเงินแล้วจุดคือถ้าเป็นmasterที่ชำระเงินแล้วคุณจะไม่สามารถกรอไปข้างหน้าอย่างรวดเร็วmasterเพราะสิ่งนั้นจะส่งผลกระทบต่อสำเนาการทำงานของคุณ git checkout headจากมันเป็นครั้งแรกโดยใช้ ฉันเห็นคำตอบอื่นที่อธิบายว่า "ยืนอยู่บนก้อนหิน" คุณต้องลงจากก้อนหินก่อนที่คุณจะย้ายได้
40XUserNotFound

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

fatal: bad config line xx in file xxxมันเป็นสิ่งสำคัญมากที่คำตอบนี้ทำให้เกิด ซึ่งเกิดจากอัฒภาค คุณต้องปิดคำสั่งทั้งหมดด้วยเครื่องหมายคำพูดคู่เพื่อหลีกเลี่ยงปัญหานี้
William Leung

1

ติดตั้งคอมไพล์ขึ้น มันทำให้คุณมีคำสั่งgit-upที่จะดึงสาขาท้องถิ่นทั้งหมดในพื้นที่เก็บข้อมูลของคุณ


หวาน! ฉันจะตรวจสอบว่าแน่นอน
Superole

2
heh: P คำแถลงการสนับสนุน Windows ไม่ได้คาดการณ์ไว้ และหลักฐานที่เข้มงวดยังไม่ได้กำหนดว่าจะไม่ยุ่งกับการตั้งค่า git ของคุณลบข้อมูลหรือโพสต์ drivel inane ไปยัง Hacker News ในนามของคุณ เมื่อรวมกับความต้องการทับทิมทำให้ฉันจากไป ฉันชอบแนวคิดแม้ว่า
Superole

ดีใจที่มีวิธีการที่ทุกคน ... sucky ครับ แต่ที่ทุกคนต้องใช้วิธีการเดียวบางเครื่องมือของบุคคลที่สาม เช่นอันนี้และอันที่มีคำสั่งเชลล์บางคำสั่ง "สูตร" หรือนามแฝงที่ใช้เปลือกเฉพาะ (เฉพาะแพลตฟอร์ม)
0xC0000022L

0

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

อย่างไรก็ตามความคิดเห็นของ @jjlinทำให้ฉันรู้ว่าอย่างน้อยฉันไม่จำเป็นต้องดึงสองครั้ง

ดังนั้นลำดับที่มีประสิทธิภาพมากขึ้นจะเป็น:

git pull
git checkout master
git merge origin/master
git checkout -

ฉันตัดสินใจสร้างนามแฝง แต่ตัดสินใจที่จะดึงมันออกและมุ่งเน้นไปที่การส่งต่อสาขาที่แตกต่างกันอย่างรวดเร็ว

[alias]
ffwd = "!_() { git checkout $1 && git merge --ff-only origin/$1 && git checkout -; }; _"

แน่นอนว่าไม่มีการทดสอบนามแฝงนี้ถือว่าฉันให้ชื่อที่ถูกต้องของสาขา ff'able เป็นอาร์กิวเมนต์ที่ 1 และมีพฤติกรรมที่ไม่ได้กำหนดไว้เป็นอย่างอื่น นอกจากนี้ยังไม่เหมาะสำหรับกรณีการใช้งานที่มีมากกว่าสองสาขา แต่จะได้รับสิ่งที่ฉันต้องการในตอนนี้

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