เก็บ git repo ไว้ใน git repo อื่น


125

นี่คือสิ่งที่ฉันต้องการ:

REPO-A
  /.git
  /otherFiles
  /REPO-B
    /.git
    /moreFiles

ฉันต้องการที่จะสามารถผลักดันเนื้อหาทั้งหมดของ REPO-A ไปที่ REMOTE-A และมีเพียง REPO-B ถึง REMOTE-B

ไปได้หรือไม่

คำตอบ:


104

ดูเหมือนคุณต้องการที่จะใช้ Git submodules

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


19
ไม่ตรง: มันจะไม่ผลักดันเนื้อหาทั้งหมดของ repoA: มีเพียง A บวกการอ้างอิงถึง B แต่ฉันไม่วิจารณ์คำตอบของคุณฉันรีบเขียนเหมือนกันมากเมื่อฉันอ่านคำถามของ OP อีกครั้ง;)
VonC

1
นี่เป็นกรณีการใช้งานสำหรับโมดูลย่อย REPO-A และ REPO-B ถือเป็น git repos ในสิทธิของตนเองพร้อมด้วยความมุ่งมั่นต้นกำเนิดประวัติศาสตร์ ฯลฯ
Damien Wilson

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

ฉันไม่ได้มองหาโซลูชันเดียวกับ OP และฉันคิดว่าโดยเฉลี่ยแล้วนี่อาจเป็นการค้นหาคำตอบสำหรับคำถามที่คล้ายกันมากกว่า: "การวาง git REPO-B ภายใน git REPO-A ฝังการอ้างอิงหรือสำเนาทั้งหมด ของ git REPO-B? ".
jaya

64

ฉันใช้ symlink เพื่อรักษาสอง repos ที่แยกจากกันและแตกต่างกันมาโดยตลอด


8
สำหรับความสับสนของโมดูลย่อย git และโครงสร้างย่อย git นี่เป็นคำตอบที่ถูกต้อง
Trevor Hickey

นอกจากนี้ยังมีประโยชน์อย่างมากสำหรับการประกอบแอปพลิเคชันเดียวจากที่เก็บระยะไกลหลายแห่ง
GeraldScott

22
ในการรักษา repo สองรายการที่แยกจากกันและแตกต่างกันจะไม่เป็นไรหรือไม่ที่จะเก็บ repo B ไว้ใน repo A และเพิ่ม repo B ใน repo A's .gitignoreเท่านั้น
Fabien Snauwaert

1
ฉันกำลังคิดที่จะทำตามที่ฟาเบียนแนะนำมีปัญหากับการทำแบบนั้นหรือไม่?
theonlygusti

1
ฉันแยกที่เก็บ git ออกจากกันและคัดลอกการเปลี่ยนแปลงที่ทำกับ REPO-B ในสำเนา REPO-B (ไม่มี. git) ที่ซ้อนอยู่ใน REPO-A ฉันทำด้วย rsync ฉันดำเนินการrsync -avh --delete --exclude='.git' REPO-B/ REPO-A/REPO-B-copy/หลังจากมีการเปลี่ยนแปลงใด ๆ ใน REPO-B
Shai

29

ได้คุณสามารถทำสิ่งที่ต้องการได้อย่างแน่นอนด้วยลำดับชั้นของไฟล์ที่คุณวาด Repo-B จะเป็นอิสระและไม่มีความรู้เกี่ยวกับ Repo-A Repo-A จะติดตามการเปลี่ยนแปลงทั้งหมดในไฟล์ของตัวเองและไฟล์ของ Repo-B

อย่างไรก็ตามฉันไม่อยากแนะนำให้ทำเช่นนี้ ทุกครั้งที่คุณเปลี่ยนไฟล์และคอมมิตใน Repo-B คุณจะต้องยอมรับใน Repo-A การแยกสาขาใน Repo-B จะยุ่งกับ Repo-A และการแยกสาขาใน Repo-A จะไม่เป็นระเบียบ (ปัญหาในการลบโฟลเดอร์ ฯลฯ ) โมดูลย่อยเป็นวิธีที่จะไป


53
คุณไม่สามารถเพิ่ม REPO-B ใน /REPO-A/.gitignore ได้หรือไม่?
mikkelbreum

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

3
ฉันไม่เห็นว่าทำไมการเพิ่ม repo git ที่ซ้อนกันในรายการละเว้นของ repo หลักจึงไม่ได้ผล .. แต่ในขณะเดียวกันฉันก็รู้สึกว่าต้องมีสิ่งที่จับได้ที่ฉันไม่ได้นึกถึงเนื่องจากวิธีนี้คือ ไม่ค่อยเห็นการแนะนำและหลาย ๆ คนก็ไม่สนใจ repos คอมไพล์ที่ซ้อนกัน
mikkelbreum

18
ฉันเพิ่งใช้สถานการณ์ที่แน่นอนนี้ ฉันมีไฟล์ CSS ที่ไม่ได้บีบอัดในโฟลเดอร์ย่อยที่ฉันไม่ต้องการส่งไปที่ repo ระยะไกลดังนั้นมันจึงอยู่ใน. gitignore ของฉัน แต่ฉันต้องการติดตามการเปลี่ยนแปลงของไฟล์เหล่านี้ในเครื่อง ฉันตั้งค่า repo ภายในโฟลเดอร์ด้วยไฟล์ที่ไม่มีการบีบอัดและเพิ่มไฟล์ทั้งหมดลงใน repo นั้น repo หลักยังคงถูกละเว้น แต่ฉันสามารถติดตามการเปลี่ยนแปลงภายใน repo ย่อยได้ แนะนำหรือไม่วิธีแก้ปัญหานี้เป็นกุญแจสำคัญสำหรับบางสถานการณ์เช่นนี้
BrianVPS

1
ฉันเข้าใจว่าเมื่อใดก็ตามที่คุณเปลี่ยนสาขาในที่เก็บหนึ่งที่เก็บอื่น ๆ จะเห็นการเปลี่ยนแปลงมากมาย แต่ทำไม "การแยกสาขาใน Repo-A จะไม่เป็นระเบียบ (ปัญหาในการลบโฟลเดอร์ ฯลฯ )"? ขอบคุณ!
user2688151

2

คุณสามารถบรรลุสิ่งที่คุณต้องการ (repo REPO-A นั้นมีไฟล์ทั้งหมดรวมถึงไฟล์ในโฟลเดอร์ REPO-B แทนที่จะเป็นเพียงข้อมูลอ้างอิง) โดยใช้ "git-subrepo":

https://github.com/ingydotnet/git-subrepo

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

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