อะไรคือความแตกต่างทางแนวคิดระหว่างการใช้ submodule git และทรีย่อย
สถานการณ์ทั่วไปสำหรับแต่ละสถานการณ์คืออะไร
อะไรคือความแตกต่างทางแนวคิดระหว่างการใช้ submodule git และทรีย่อย
สถานการณ์ทั่วไปสำหรับแต่ละสถานการณ์คืออะไร
คำตอบ:
ถ้าฉันต้องการให้ลิงก์ชี้ไปที่ 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
จะถูกใช้
add -b
และ--remote
หลังจากนั้นในคำสั่งปรับปรุงตามเอกสารการปรับปรุง submodule ในกรณีนี้-b
จำเป็นต้องมีการติดตาม HEAD of master หรือไม่?
-b
จะใช้ในการสร้างข้อมูลเมตา. gitmodule ที่ถูกต้องสำหรับ submodule (เทียบเท่ากับ a git config -f .gitmodules submodule.<path>.branch <branch>
)
--remote
- --remote
ทำงานยังถ้ายังไม่ได้ถูกนำมาใช้ในการ-b
add
ในทั้งสองกรณีการปรับปรุงจะทำให้เกิดการกระทำใน repo หลักที่อยู่อาศัย submodule ดังนั้นการเชื่อมโยงไม่ได้จริงๆ "ชี้ไปที่หัว" เสมอในทางอัตโนมัติมาก .... ทั้งฉันไม่ได้รับมันหรือการเรียกร้องที่ ดีกว่าถูกลบออกจากคำตอบเดิม (?)
submodule คือลิงก์
ทรีย่อยคือ copy
ความแตกต่างทางแนวคิดคือ:
ด้วยsubmodules gitโดยทั่วไปคุณต้องการแยกที่เก็บขนาดใหญ่เป็นอันที่เล็กกว่า วิธีการอ้างอิง submodule เป็นสไตล์ maven - คุณกำลังอ้างถึงการคอมมิทเดียวจาก repository อื่น (submodule) หากคุณต้องการการเปลี่ยนแปลงภายใน submodule คุณต้องทำการ commit / push ภายใน submodule จากนั้นอ้างอิงการคอมมิทใหม่ใน repository หลักแล้วทำการ commit / push การอ้างอิงที่เปลี่ยนแปลงของ repository หลัก วิธีนี้คุณจะต้องเข้าถึงที่เก็บข้อมูลทั้งคู่สำหรับบิลด์ที่สมบูรณ์
ด้วยทรีย่อย gitคุณจะรวมที่เก็บข้อมูลอื่นในของคุณรวมถึงประวัติของมันด้วย ดังนั้นหลังจากรวมแล้วขนาดของที่เก็บของคุณน่าจะใหญ่กว่า (ดังนั้นนี่จึงไม่มีกลยุทธ์ในการทำให้ที่เก็บมีขนาดเล็กลง) หลังจากการรวมไม่มีการเชื่อมต่อกับที่เก็บอื่นและคุณไม่จำเป็นต้องเข้าถึงมันเว้นแต่คุณต้องการได้รับการอัพเดท ดังนั้นกลยุทธ์นี้ใช้สำหรับการใช้รหัสและประวัติอีกครั้ง - โดยส่วนตัวฉันไม่ได้ใช้
git subtree
คุณก็ยังสามารถผลัก - ถ้าคุณต้องการ - ใช่ไหม
โมดูลย่อย
ผลัก repo หลักไปยังระยะไกลไม่ส่งไฟล์ของโมดูลย่อย
ต้นไม้ย่อย
ผลักดัน repo หลักไปยังระยะไกลผลักดันไฟล์ของต้นไม้ย่อย
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags production refs/heads/master:refs/heads/master