นี้หน้า GitProไม่สรุปผลของการปรับปรุงการคอมไพล์ submodule อย่าง
เมื่อคุณเรียกใช้git submodule update
มันจะตรวจสอบโครงการเฉพาะรุ่น แต่ไม่อยู่ในสาขา สิ่งนี้เรียกว่าการมีเฮดเดอร์เดี่ยว - หมายถึงไฟล์ HEAD ชี้ไปที่การคอมมิทโดยตรงไม่ใช่การอ้างอิงสัญลักษณ์ ปัญหาก็คือคุณมักไม่ต้องการที่จะทำงานในสภาพแวดล้อมที่หัวเดี่ยวเพราะมันเป็นเรื่องง่ายที่จะสูญเสียการเปลี่ยนแปลง
หากคุณทำการอัปเดต submodule เริ่มต้นให้คอมมิตในไดเร็กทอรี่ submodule นั้นโดยไม่ต้องสร้างสาขาเพื่อทำงานจากนั้นรัน god submodule update อีกครั้งจาก superproject โดยไม่ต้องทำในเวลาเดียวกัน Git จะเขียนทับการเปลี่ยนแปลงของคุณโดยไม่บอกคุณ ในทางเทคนิคคุณจะไม่สูญเสียงาน แต่คุณจะไม่มีสาขาที่ชี้ไปที่มันดังนั้นมันจะค่อนข้างยากที่จะเรียกคืน
หมายเหตุมีนาคม 2013:
ดังที่กล่าวไว้ใน " การติดตาม submodule git ล่าสุด " ตอนนี้ submodule (git1.8.2) สามารถติดตามสาขาได้
# add submodule to track master branch
git submodule add -b master [URL to Git repo];
# update your submodule
git submodule update --remote
# or (with rebase)
git submodule update --rebase --remote
ดู " git submodule update --remote
vsgit pull
"
คำตอบของMindToothแสดงให้เห็นถึงการอัพเดทด้วยตนเอง (โดยไม่มีการกำหนดค่าในเครื่อง):
git submodule -q foreach git pull -q origin master
ในทั้งสองกรณีที่จะเปลี่ยนการอ้างอิง submodules ( gitlink , รายการพิเศษในดัชนี repo หลัก ) และคุณจะต้องเพิ่มกระทำและผลักดันการอ้างอิงดังกล่าวจาก repo หลัก
ครั้งต่อไปที่คุณจะโคลนผู้ปกครอง repo มันจะเติมข้อมูลเพื่อสะท้อนการอ้างอิง SHA1 ใหม่เหล่านั้น
ส่วนที่เหลือของคำตอบนี้ให้รายละเอียดเกี่ยวกับคุณลักษณะ submodule แบบคลาสสิก (อ้างอิงถึงการกระทำที่คงที่ซึ่งเป็นจุดที่อยู่เบื้องหลังแนวคิดของ submodule)
เพื่อหลีกเลี่ยงปัญหานี้ให้สร้างสาขาเมื่อคุณทำงานในไดเรกทอรี submodule ด้วย git checkout -b งานหรือสิ่งที่เทียบเท่า เมื่อคุณทำ submodule อัปเดตเป็นครั้งที่สองมันจะยังคงกลับไปทำงานของคุณ แต่อย่างน้อยคุณก็มีตัวชี้เพื่อกลับไป
การสลับสาขากับ submodules ในพวกเขายังสามารถหากิน หากคุณสร้างสาขาใหม่เพิ่ม submodule ที่นั่นแล้วเปลี่ยนกลับเป็นสาขาที่ไม่มี submodule นั้นคุณยังคงมีไดเรกทอรี submodule เป็นไดเรกทอรีที่ไม่ได้ติดตาม:
ดังนั้นเพื่อตอบคำถามของคุณ:
ฉันสามารถสร้างสาขา / การดัดแปลงและใช้การผลัก / ดึงเหมือนที่ฉันทำใน repos ปกติหรือมีสิ่งที่ต้องระวังหรือไม่
คุณสามารถสร้างสาขาและการปรับเปลี่ยนแบบพุช
คำเตือน (จากGit Submodule Tutorial ): เผยแพร่ (ดัน) การเปลี่ยนแปลง submodule ทุกครั้งก่อนที่จะเผยแพร่ (กด) การเปลี่ยนแปลงของ superproject ที่อ้างอิงถึงมัน หากคุณลืมที่จะเผยแพร่การเปลี่ยนแปลง submodule คนอื่นจะไม่สามารถโคลนที่เก็บ
ฉันจะเลื่อนระดับอนุเสาวรีย์ที่อ้างอิงจากการพูด (ติดแท็ก) 1.0 เป็น 1.1 ได้อย่างไร (แม้ว่าหัวหน้า repo ดั้งเดิมจะมีอยู่ที่ 2.0)
หน้า "การทำความเข้าใจกับโมดูลย่อย " สามารถช่วยได้
God submodules ถูกนำมาใช้โดยใช้สองส่วนที่เคลื่อนไหว:
.gitmodules
ไฟล์และ
- วัตถุต้นไม้ชนิดพิเศษ
เหล่านี้ร่วมกันเป็นรูปสามเหลี่ยมการแก้ไขเฉพาะของพื้นที่เก็บข้อมูลที่เฉพาะเจาะจงซึ่งมีการตรวจสอบลงในสถานที่เฉพาะในโครงการของคุณ
จากหน้า submodule git
คุณไม่สามารถแก้ไขเนื้อหาของ submodule จากภายในโครงการหลัก
ถูกต้อง 100%: คุณไม่สามารถแก้ไข submodule เพียงอ้างถึงข้อผูกพันข้อใดข้อหนึ่ง
นี่คือเหตุผลที่เมื่อคุณแก้ไข submodule จากภายในโครงการหลักคุณ:
- ต้องยอมรับและผลักดันภายใน submodule (ไปยังโมดูลอัปสตรีม) และ
- จากนั้นขึ้นไปในโครงการหลักของคุณและมอบหมายอีกครั้ง (เพื่อให้โครงการหลักนั้นอ้างถึง submodule ใหม่ที่คุณเพิ่งสร้างและผลักดัน)
submodule ช่วยให้คุณมี การพัฒนาวิธีการตามองค์ประกอบที่โครงการหลักหมายถึงการกระทำที่เฉพาะเจาะจงของส่วนประกอบอื่น ๆ (ที่นี่ "ที่เก็บ Git อื่น ๆ ประกาศเป็นโมดูลย่อย")
submodule เป็นเครื่องหมาย (กระทำ) ไปยังพื้นที่เก็บข้อมูล Git อื่นซึ่งไม่ได้ถูกผูกไว้โดยวงจรการพัฒนาโครงการหลัก: มัน ("อื่น ๆ " Git repo) สามารถวิวัฒนาการได้อย่างอิสระ
มันขึ้นอยู่กับโครงการหลักที่จะเลือกจาก repo อื่น ๆ ไม่ว่าจะเป็นการกระทำที่ต้องการ
อย่างไรก็ตามคุณควรต้องการที่จะออกจากความสะดวกสบาย , แก้ไขหนึ่ง submodules เหล่านั้นได้โดยตรงจากโครงการหลักของคุณ Git ช่วยให้คุณทำอย่างนั้นให้คุณแรกเผยแพร่การปรับเปลี่ยน submodule เหล่านั้นเพื่อ Git repo เดิมและจากนั้นกระทำโครงการหลักของคุณหมายถึงใหม่รุ่นของ submodule กล่าวว่า
แต่แนวคิดหลักยังคงอยู่: อ้างอิงองค์ประกอบเฉพาะซึ่ง:
- มีวงจรชีวิตของตัวเอง
- มีชุดแท็กของตนเอง
- มีการพัฒนาของตัวเอง
รายการของการคอมมิทเฉพาะที่คุณอ้างถึงในโครงการหลักของคุณกำหนดการกำหนดค่าของคุณ(นี่คือสิ่งที่การจัดการการกำหนดค่าเป็นเรื่องเกี่ยวกับการรวบรวมเพียงระบบควบคุมเวอร์ชัน )
หากองค์ประกอบสามารถพัฒนาได้ในเวลาเดียวกับโครงการหลักของคุณ (เพราะการดัดแปลงใด ๆ ในโครงการหลักจะเกี่ยวข้องกับการแก้ไขไดเรกทอรีย่อยและในทางกลับกัน) ก็จะเป็น "submodule" ไม่มากไปกว่า subtree merge (นำเสนอในคำถามการถ่ายโอนฐานรหัสดั้งเดิมจาก cvs ไปยังที่เก็บแบบกระจาย ) เชื่อมโยงประวัติของ repo Git ทั้งสองเข้าด้วยกัน
นั่นช่วยทำความเข้าใจธรรมชาติที่แท้จริงของ Submodules Git หรือไม่?