การจัดกลุ่มที่เก็บ Git หลายแห่งซึ่งเป็นส่วนหนึ่งของโครงการโดยรวมเดียวกัน


14

สมมติว่าฉันมีโครงการที่มีส่วนประกอบหลายส่วน: ส่วนประกอบเซิร์ฟเวอร์, องค์ประกอบของเว็บแอป, ส่วนประกอบ iOS, ส่วนประกอบ Android, ฯลฯ ส่วนประกอบเหล่านี้เป็นรหัสฐานที่แยกจากกันทั้งหมด แต่ยังรวมกันอย่างหลวม ๆ รหัสอาจต้องการการเปลี่ยนแปลงส่วนประกอบอื่น ๆ ทั้งหมดด้วย)

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

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

มีคุณสมบัติในการคอมไพล์นอกการรักษาที่ทันสมัย ​​readmes (หรือทางออกที่ดีกว่าฉันไม่เห็น) เพื่อจัดการ repos ที่เกี่ยวข้องหลายรายการได้อย่างมีประสิทธิภาพมากขึ้น?


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

นี่คือการสนทนาเก่าของ StackOverflow (ยังไม่ปิดอย่างน่าอัศจรรย์)
Dan Dascalescu

คำตอบ:


6

โครงการย่อยคือสถานที่ที่มีการกระจายระบบการควบคุมเวอร์ชัน (DVCS) เริ่มถ้าไม่คลี่คลายแน่นอนกลายเป็นเล็ก ๆ น้อย ๆ ที่สกปรก

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

ยังคง repos หลายโครงการยังคงเป็นกรณีการใช้งานพิเศษมากกว่าคุณสมบัติที่ทุกคนใช้มัน เอกสารประกอบด้วยคำเตือนจำนวนมากและคำแนะนำ "วิธีใช้นี้" ที่ชัดเจนว่าการจัดการ "โครงการของโครงการ" เป็นข้อกังวลสองระดับด้วยการจัดการเมตาเล็กน้อย แต่แตกต่างอย่างแท้จริงมากกว่าการจัดการโครงการโดยตรงระดับเดียว เป็นผลให้มีประสบการณ์น้อยมาก และไม่มีปัญหาการ "ไม่ใช้ submodules git!" และ "หลีกเลี่ยงการย่อยด้วย Mercurial!" ความคิดเห็นและบล็อกโพสต์

ประสบการณ์ของฉันเกี่ยวกับงานย่อยถูกผสม มันใช้งานได้ ... แต่มันก็น่ารำคาญเช่นกัน ฉันชอบความคิดของโปรเจ็กต์ย่อย แต่ในทางปฏิบัติพบว่ามีทางเลือกไม่ว่าจะเป็น repos ขนาดใหญ่แบบ all-in-one หรือโปรเจ็กต์พี่น้องที่มีขนาดใหญ่ ฉันหวังว่าจะมีงานประจาวันเป็นหลักและไม่ใช่ความเจ็บปวด แต่ฉันยังไม่เคยมีประสบการณ์

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

กำหนดว่าคุณกำลังมุ่งเน้น Git คุณควรสำรวจ subtrees Git ซึ่งพบบางอย่างที่จะเป็นทางเลือกที่ดีกว่าที่จะ submodules


1
Revisiting ในปี 2016: เอกสารปรอทยังคงเรียก subrepos คุณลักษณะของรีสอร์ท เอกสาร Git มีความกระตือรือร้นมากขึ้นและมันsubmoduleคุณลักษณะคือตอนนี้บูรณาการมากขึ้น ตอนนี้ทั้งสองยังจัดการrepos ที่ซ้อนกันได้ดี (การรับรู้ repo ที่ซ้อนกัน "มีลูกบอล" พร้อมกับไฟล์ที่จัดการอยู่) ให้ตัวเลือกย่อย repo ที่มีประโยชน์อีกตัวหนึ่ง แต่เครื่องมือ DVCS ยังคงสำคัญในการซื้อซ้ำในระดับเดียวดังนั้น "sub-repos => การจัดการหลายระดับ" และ "มังกรมาที่นี่" คำเตือนยังคงมีความเกี่ยวข้อง
Jonathan Eunice

2

หากคุณใช้ C # คุณสามารถใช้ NuGet ได้

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

สุดท้ายให้ผู้สร้างของคุณทำการแพคเกจไลบรารีลงในแพ็คเกจ NuGet และใช้แพ็คเกจ NuGet เหล่านั้นในโครงการสำหรับส่วนประกอบหน้า (iOS, Android)

วิธีการพื้นฐานเดียวกัน (การอ้างอิงรุ่นและแพ็คเกจ) สามารถใช้ในภาษาอื่นได้เช่นกัน แต่อาจไม่สะดวก

ฉันจะไม่แนะนำให้คุณใช้ Git Submodules แม้ว่าจะสามารถใช้กับปัญหาประเภทนี้ได้ในทางทฤษฎี แต่ฉันรู้สึกว่ามันเป็นเรื่องยุ่งยากมากกว่าที่ควรค่า


2

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

ตัวเลือกที่เป็นไปได้สองทางจะเป็นที่เก็บเดียวที่มี submodules หรือหลาย repositories พร้อมกับแนวทางปฏิบัติเกี่ยวกับการกำหนดเวอร์ชันที่ดี

คุณจะสามารถ "ลิงก์" ที่เก็บข้อมูลเหล่านี้ได้อย่างไรเพื่อที่คุณจะได้รู้ว่าเวอร์ชัน 2.0 ของแอปนั้นต้องการส่วนประกอบของเซิร์ฟเวอร์เวอร์ชัน 1.5 หรือไม่

ซึ่งมักเป็นโดเมนของกรอบการจัดการการพึ่งพา (เช่น Gradle, Maven) ไม่ใช่ Git

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