ที่เก็บ Git ซ้อนกัน?


181

ฉันสามารถซ้อนที่เก็บของ Git ได้หรือไม่ ฉันมี:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

มันสมเหตุสมผลหรือไม่ที่จะทำให้git init/addการ/project_rootจัดการทุกอย่างในท้องถิ่นง่ายขึ้นหรือฉันต้องจัดการmy_projectแยกจากกันและเป็นบุคคลที่สาม?

คำตอบ:


159

คุณอาจจะมองหาคุณลักษณะ Git เรียกsubmodules คุณลักษณะนี้ช่วยให้คุณจัดการที่เก็บซึ่งขึ้นต่อกันซึ่งซ้อนอยู่ภายในที่เก็บหลักของคุณ


43
ในฐานะผู้เริ่มต้นคอมไพล์ฉันพบว่าบล็อก / กวดวิชานี้ง่ายต่อการเข้าใจchrisjean.com/2009/04/20/วิธีการที่ง่ายขึ้นโดยมุ่งเน้นที่เพียงแค่คอมไพล์แทนที่จะใช้บริบทของเชลล์สคริปต์ผู้ช่วยเหลือ ฉันพบว่าอ่านง่ายขึ้น
John K

4
บล็อก chrisjean.com ดูเหมือนจะไม่เป็นปัจจุบันขึ้นอยู่กับเพียงแค่พยายามที่จะติดตามมัน โพสต์วิกิพีเดียจากเกร็กอาจเป็นบิตซับซ้อนมากขึ้น แต่เป็นมือใหม่ Git ฉันชอบที่ถูกต้องเพื่อง่าย ...
ปัญญาชน

บล็อกดูเหมือนว่าจะทำงานได้ดีในขณะนี้และขออภัยสำหรับปราชญ์ที่ 34 (ตอนนี้ 35) โหวตขึ้นความคิดเห็นดูเหมือนว่าจะยอมรับว่ามีค่าในบทความบล็อก ปรากฎว่าคุณไม่ต้องเสียสละความแม่นยำเพื่อความชัดเจนและคำแนะนำเฉพาะการใช้งาน หลังจากอ่านแล้วฉันจะจินตนาการว่าผู้เขียนค้นคว้าข้อมูลมาแล้วและอาจอ่านเอกสาร Gitจริงไม่ใช่แค่หน้า kernel.org wiki คำอธิบายเชิง Git ของผู้เขียนบล็อกในตัวอย่างเชิงบริบทดูเหมือนจะมีประโยชน์สำหรับคนจำนวนมาก ...
Matthew Weber

13
BTW ที่ลิงก์ chrisjean ดังกล่าวข้างต้นตายแล้ว ลิงก์ที่อัปเดตคือchrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh

35

วางห้องสมุดบุคคลที่สามของคุณในที่เก็บแยกต่างหากและใช้ submodules เพื่อเชื่อมโยงกับโครงการหลัก นี่คือการเดินเท้า:

http://git-scm.com/book/en/Git-Tools-Submodules

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


22

เพียงเพื่อความสมบูรณ์:

มีวิธีอื่นคือฉันอยากจะแนะนำ: การผสานทรีย่อย

ตรงกันข้ามกับ submodules ง่ายต่อการบำรุงรักษา คุณจะสร้างที่เก็บแต่ละแห่งด้วยวิธีปกติ ขณะที่อยู่ในพื้นที่เก็บข้อมูลหลักของคุณคุณต้องการรวมต้นแบบ (หรือสาขาอื่น ๆ ) ของที่เก็บข้อมูลอื่นในไดเรกทอรีของไดเรกทอรีหลักของคุณ

$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`

จากนั้นเพื่อดึงที่เก็บอื่นไปยังไดเรกทอรีของคุณ (เพื่ออัปเดต) ให้ใช้กลยุทธ์การรวมทรีย่อย:

$ git pull -s subtree OtherRepository master

ฉันใช้วิธีนี้มานานหลายปีแล้วมันใช้งานได้ :-)

เพิ่มเติมเกี่ยวกับวิธีนี้รวมถึงการเปรียบเทียบกับโมดูลย่อยสามารถพบได้ใน git howto docนี้


การรวมทรีย่อยการรวมเข้าไปในหนังสือ git ไม่ทำงานอีกต่อไป ปัจจุบันดูเหมือนจะเป็นลิงก์: git-scm.com/book/en/v2/…
ericx

18

คุณสามารถเพิ่ม

/project_root/third_party_git_repository_used_by_my_project

ถึง

/project_root/.gitignore

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

แต่: หากผู้ใช้รัน git clean -dfx ใน repo แม่จะลบ repo ที่ซ้อนกันที่ถูกละเว้น อีกวิธีคือการเชื่อมโยงโฟลเดอร์และละเว้น symlink ถ้าคุณเรียกใช้ git clean แล้ว symlink จะถูกลบ แต่ repo 'ซ้อน' จะยังคงอยู่เหมือนเดิมเพราะมันอยู่ที่อื่น


14

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


3
สถานที่นี้ได้รับการรวมเข้ากับ Git นี่คือคำอธิบายที่ดี: developer.atlassian.com/blog/2015/05/the-power-of-git-subtree
Brent Bradburn

5

สรุป.

ฉันสามารถซ้อนที่เก็บคอมไพล์ได้หรือไม่?

ใช่. อย่างไรก็ตามโดยค่าเริ่มต้น git ไม่ได้ติดตาม.gitโฟลเดอร์ของที่เก็บซ้อน Git มีคุณสมบัติที่ออกแบบมาเพื่อจัดการที่เก็บซ้อน (อ่านต่อ)

มันสมเหตุสมผลไหมที่จะคอมไพล์ init / เพิ่ม / project_root เพื่อความสะดวกในการจัดการทุกอย่างในพื้นที่หรือฉันต้องจัดการ my_project และบุคคลที่สามแยกจากกัน?

อาจไม่เหมาะสมเนื่องจาก git มีคุณสมบัติในการจัดการที่เก็บซ้อน Git ที่สร้างขึ้นในลักษณะการจัดการที่เก็บซ้อนกันอยู่และsubmodulesubtree

นี่คือบล็อกในหัวข้อและนี่คือคำถาม SOที่ครอบคลุมข้อดีข้อเสียของการใช้งานแต่ละข้อ


2

ฉันจะใช้หนึ่งที่เก็บต่อโครงการ ด้วยวิธีนี้ประวัติจะง่ายขึ้นในการเรียกดู

ฉันจะตรวจสอบเวอร์ชันของห้องสมุดบุคคลที่สามที่ฉันใช้อยู่ในที่เก็บของโครงการที่ใช้

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