ความแตกต่างระหว่าง god submodule และต้นไม้ย่อย


300

อะไรคือความแตกต่างทางแนวคิดระหว่างการใช้ submodule git และทรีย่อย

สถานการณ์ทั่วไปสำหรับแต่ละสถานการณ์คืออะไร


3
สิ่งนี้อาจไม่ตอบคำถามของคุณทั้งหมด แต่เป็นการอ่านที่น่าสนใจในเรื่อง: blogs.atlassian.com/2013/05/…
Chop

คำถามที่คล้ายกันคือstackoverflow.com/questions/571232/…
Michael Freidgeim

"ทางเลือกแทน Git Submodules?": stackoverflow.com/questions/6500524/…
brillout

คำตอบ:


177

ถ้าฉันต้องการให้ลิงก์ชี้ไปที่ HEAD ของ repo ภายนอกเสมอ

คุณสามารถสร้าง submodule เพื่อติดตาม HEAD ของสาขาของ repo remote repo ด้วย:

git submodule add -b <branch> <repository> [<path>]โอ (เพื่อระบุสาขาที่จะปฏิบัติตาม)
o git submodule update --remoteซึ่งจะปรับปรุงเนื้อหาของ submodule ไป HEAD ล่าสุดจากโดยค่าเริ่มต้น<repository>/<branch> origin/masterโครงการหลักของคุณจะยังคงติดตาม hash ของ HEAD ของ submodule แม้ว่า--remoteจะถูกใช้



คำตอบของคุณดูเหมือนจะขัดแย้งกับคำตอบที่โหวตไว้ที่นี่: stackoverflow.com/questions/10443627/…
นาธาน H

@NathanH สิ่งนี้ (ความเป็นไปได้ในการติดตาม HEAD) ได้รับการเพิ่มในอีกหนึ่งปีต่อมา (มีนาคม 2013, คอมไพล์ 1.8.2: github.com/git/git/blob/ … )
VonC

ผมเห็นพฤติกรรม submodule followship ยังถูกกล่าวถึงในanwer อื่น ๆ ของคุณ ในกรณีที่ฉันคิดว่าคุณหมายถึงจะบอกว่ามักจะชี้ไปที่หัวของ submodule ที่สามารถทำได้โดยใช้ทั้งadd -bและ--remoteหลังจากนั้นในคำสั่งปรับปรุงตามเอกสารการปรับปรุง submodule ในกรณีนี้-bจำเป็นต้องมีการติดตาม HEAD of master หรือไม่?
matanster

@matt -bจะใช้ในการสร้างข้อมูลเมตา. gitmodule ที่ถูกต้องสำหรับ submodule (เทียบเท่ากับ a git config -f .gitmodules submodule.<path>.branch <branch>)
VonC

จากนั้นก็จะมีน้อยจะทำอย่างไรกับการเปิดใช้งาน--remote- --remoteทำงานยังถ้ายังไม่ได้ถูกนำมาใช้ในการ-b addในทั้งสองกรณีการปรับปรุงจะทำให้เกิดการกระทำใน repo หลักที่อยู่อาศัย submodule ดังนั้นการเชื่อมโยงไม่ได้จริงๆ "ชี้ไปที่หัว" เสมอในทางอัตโนมัติมาก .... ทั้งฉันไม่ได้รับมันหรือการเรียกร้องที่ ดีกว่าถูกลบออกจากคำตอบเดิม (?)
matanster


121

ความแตกต่างทางแนวคิดคือ:

ด้วยsubmodules gitโดยทั่วไปคุณต้องการแยกที่เก็บขนาดใหญ่เป็นอันที่เล็กกว่า วิธีการอ้างอิง submodule เป็นสไตล์ maven - คุณกำลังอ้างถึงการคอมมิทเดียวจาก repository อื่น (submodule) หากคุณต้องการการเปลี่ยนแปลงภายใน submodule คุณต้องทำการ commit / push ภายใน submodule จากนั้นอ้างอิงการคอมมิทใหม่ใน repository หลักแล้วทำการ commit / push การอ้างอิงที่เปลี่ยนแปลงของ repository หลัก วิธีนี้คุณจะต้องเข้าถึงที่เก็บข้อมูลทั้งคู่สำหรับบิลด์ที่สมบูรณ์

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


แต่git subtreeคุณก็ยังสามารถผลัก - ถ้าคุณต้องการ - ใช่ไหม
Ixx

@lxx หากคุณทราบ URL ของที่เก็บ ...
Franklin Yu

@ FrankankYu ทำไมเขาถึงไม่รู้เช่นนั้น? ไม่สามารถรับข้อมูลนั้นจากข้อมูลเมตาท้องถิ่น git?
adi518

@ adi518 ใช่ถ้าคุณเป็นคนที่สร้างทรีย่อย อย่างไรก็ตามถ้าคุณผลักที่เก็บของคุณไปที่ GitHub และคนอื่น ๆ ลอกมันออกมาฉันไม่คิดว่าเขา / เธอจะรู้จัก URL ย่อยโดยอัตโนมัติ
Franklin Yu

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

21

โมดูลย่อย
ผลัก repo หลักไปยังระยะไกลไม่ส่งไฟล์ของโมดูลย่อย

ต้นไม้ย่อย
ผลักดัน repo หลักไปยังระยะไกลผลักดันไฟล์ของต้นไม้ย่อย


3
"การผลักดัน repo หลักไปยังการผลักดันไฟล์ย่อยของรีโมต" ไม่มันไม่เป็นเช่นนั้น
J Bramble

@JBramble ฉันน่าจะพูดถึงมันเสร็จแล้วด้วยแอพ SourceTree เช่น:git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master
Maciek Rek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.