สมมติว่าที่เก็บของ submodule มีคอมมิทที่คุณต้องการใช้ (ไม่เหมือนกับคอมมิทที่อ้างอิงจากสถานะปัจจุบันของโปรเจ็กต์สุด) มีสองวิธีในการทำ
ก่อนอื่นคุณต้องทราบความมุ่งมั่นจาก submodule ที่คุณต้องการใช้ มันทำงานได้จาก "ภายในออก" โดยการปรับ submodule โดยตรงจากนั้นอัปเดตซุปเปอร์โปรเจ็กต์ ผลงานที่สองจาก“ ภายนอก” โดยการค้นหาการกระทำของโครงการพิเศษที่แก้ไข submodule แล้วทำการรีเซ็ตดัชนีของโครงการ super เพื่ออ้างอิงการส่งข้อมูลย่อยอื่น ๆ
กลับด้าน
ถ้าคุณรู้อยู่แล้วซึ่งกระทำคุณต้องการ submodule ที่จะใช้cd
ในการ submodule ให้ตรวจสอบการกระทำที่คุณต้องการแล้วgit add
และgit commit
มันกลับมาอยู่ในซุปเปอร์โครงการ
ตัวอย่าง:
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
อ๊ะคนทำซุปเปอร์โครงการกระทำที่อ้างอิงถึงการที่ไม่ได้เผยแพร่กระทำใน sub
submodule อย่างใดที่เรารู้อยู่แล้วว่าเราต้องการ submodule 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
ที่จะกระทำการที่ ไปที่นั่นและตรวจสอบโดยตรง
ชำระเงินใน Submodule
$ cd sub
$ git checkout 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Note: moving to '5d5a3ee314476701a20f2c6ec4a53f88d651df6c' which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
git checkout -b <new_branch_name>
HEAD is now at 5d5a3ee... quux
$ cd ..
เนื่องจากเรากำลังตรวจสอบการกระทำสิ่งนี้ทำให้เกิด HEAD ที่แยกออกมาใน submodule หากคุณต้องการให้แน่ใจว่า submodule ใช้สาขาจากนั้นใช้git checkout -b newbranch <commit>
เพื่อสร้างและชำระเงินสาขาที่กระทำหรือชำระเงินสาขาที่คุณต้องการ (เช่นที่มีการกระทำที่ต้องการกระทำที่ปลาย)
อัพเดท Super-project
เช็คเอาต์ใน submodule นั้นจะปรากฎใน super-project เพื่อเปลี่ยนเป็นแผนผังการทำงาน ดังนั้นเราต้องแสดงการเปลี่ยนแปลงในดัชนีของโครงการซุปเปอร์และตรวจสอบผลลัพธ์
$ git add sub
ตรวจสอบผลลัพธ์
$ git submodule update
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
การอัปเดต submodule นั้นเป็นแบบไม่โต้ตอบเนื่องจาก submodule นั้นอยู่ที่การคอมมิทที่ระบุแล้ว diff แรกแสดงให้เห็นว่าดัชนีและ worktree เหมือนกัน diff ที่สามแสดงว่าการเปลี่ยนแปลง staged เดียวคือการย้ายsub
submodule ไปยัง commit อื่น
ผูกมัด
git commit
สิ่งนี้คอมมิตยอมรับรายการ submodule ที่แก้ไขแล้ว
ข้างนอกใน
หากคุณไม่แน่ใจว่าควรใช้คอมมิทใดจาก submodule คุณสามารถดูประวัติใน superproject เพื่อนำทางคุณได้ คุณสามารถจัดการการรีเซ็ตได้โดยตรงจากโปรเจ็กต์ระดับซุปเปอร์
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
นี่เป็นสถานการณ์เดียวกันกับข้างต้น แต่คราวนี้เราจะมุ่งเน้นที่การแก้ไขจาก super-project แทนที่จะจุ่มลงใน submodule
ค้นหา Erit Commit ของ Super-project
$ git log --oneline -p -- sub
ce5d37c local change in sub
diff --git a/sub b/sub
index 5d5a3ee..e47c0a1 160000
--- a/sub
+++ b/sub
@@ -1 +1 @@
-Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
+Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
bca4663 added sub
diff --git a/sub b/sub
new file mode 160000
index 0000000..5d5a3ee
--- /dev/null
+++ b/sub
@@ -0,0 +1 @@
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
ตกลงดูเหมือนว่าจะไม่ดีce5d37c
ดังนั้นเราจะคืนค่า submodule จาก parent ( ce5d37c~
)
หรือคุณสามารถใช้การส่งข้อมูลย่อยของข้อความแพทช์ ( 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) และใช้กระบวนการ“ ข้างในออก” ข้างต้นแทน
ชำระเงินในโครงการซุปเปอร์
$ git checkout ce5d37c~ -- sub
นี่เป็นการรีเซ็ตรายการ submodule สำหรับsub
สิ่งที่มันถูกคอมมิทce5d37c~
ใน super-project
อัพเดท Submodule
$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'
การอัปเดต submodule เป็นไปด้วยดี
ตรวจสอบผลลัพธ์
$ git diff ce5d37c~ -- sub
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
ครั้งแรกที่แสดงให้เห็นถึงความแตกต่างว่าขณะนี้ในตัวเดียวกันsub
ce5d37c~
ส่วนต่างที่สองแสดงว่าดัชนีและ worktree เหมือนกัน ส่วนต่างที่สามแสดงให้เห็นว่าการเปลี่ยนแปลงแบบฉากเพียงอย่างเดียวคือการเคลื่อนย้ายsub
submodule ไปยังการคอมมิทที่ต่างกัน
ผูกมัด
git commit
สิ่งนี้คอมมิตยอมรับรายการ submodule ที่แก้ไขแล้ว