คุณได้เพิ่มvendor/plugins/open_flash_chart_2
เป็นรายการ“ gitlink” แต่ไม่เคยกำหนดไว้ว่าเป็น submodule อย่างมีประสิทธิภาพคุณกำลังใช้คุณสมบัติภายในที่git submoduleใช้ (รายการ gitlink) แต่คุณไม่ได้ใช้คุณสมบัติ submodule เอง
คุณอาจทำสิ่งนี้:
git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2
คำสั่งสุดท้ายนี้เป็นปัญหา ไดเรกทอรีvendor/plugins/open_flash_chart_2
เริ่มต้นจากที่เก็บ Git อิสระ โดยปกติแล้วที่เก็บย่อยนั้นจะถูกเพิกเฉย แต่ถ้าคุณบอกให้git เพิ่มเพื่อเพิ่มมันอย่างชัดเจนมันจะสร้างรายการ gitlink ที่ชี้ไปที่ HEAD ของที่เก็บย่อยแทนการเพิ่มเนื้อหาของไดเรกทอรี มันอาจจะดีถ้าเพิ่ม gitจะปฏิเสธที่จะสร้าง "กึ่ง submodules"
ไดเรกทอรีปกติจะแสดงเป็นวัตถุต้นไม้ใน Git; วัตถุต้นไม้ให้ชื่อและการอนุญาตให้วัตถุที่พวกเขามี (โดยปกติวัตถุต้นไม้และหยดอื่น ๆ - ไดเรกทอรีและไฟล์ตามลำดับ) โมดูลย่อยจะแสดงเป็นรายการ“ gitlink”; รายการ gitlink มีชื่อวัตถุ (แฮช) ของการกระทำ HEAD ของ submodule เท่านั้น “ แหล่งเก็บข้อมูล” สำหรับการคอมมิทของ gitlink ถูกระบุไว้ใน.gitmodules
ไฟล์ (และ.git/config
ไฟล์เมื่อเริ่มต้น submodule)
สิ่งที่คุณมีคือรายการที่ชี้ไปที่การคอมมิทเฉพาะโดยไม่บันทึกที่เก็บซอร์สสำหรับการคอมมิทนั้น คุณสามารถแก้ไขได้โดยการทำให้ gitlink ของคุณเป็นซับไดโทลที่เหมาะสมหรือลบ gitlink และแทนที่ด้วยเนื้อหา“ ปกติ” (ไฟล์และไดเรกทอรีธรรมดา)
เปลี่ยนให้เป็น Submodule ที่เหมาะสม
บิตเดียวที่คุณหายไปเพื่อกำหนดอย่างถูกต้องvendor/plugins/open_flash_chart_2
เป็น submodule เป็น.gitmodules
ไฟล์ โดยปกติ (หากคุณยังไม่ได้เพิ่มเป็นรายการ gitlink เปล่า) คุณจะใช้git submodule add
:
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
ตามที่คุณพบสิ่งนี้จะไม่ทำงานหากเส้นทางนั้นมีอยู่แล้วในดัชนี ทางออกคือการลบรายการ gitlink ออกจากดัชนีชั่วคราวแล้วเพิ่ม submodule:
git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
สิ่งนี้จะใช้พื้นที่เก็บข้อมูลย่อยที่มีอยู่ของคุณ (เช่นจะไม่โคลนพื้นที่เก็บข้อมูลต้นฉบับอีกครั้ง) และจัดวาง.gitmodules
ไฟล์ที่มีลักษณะดังนี้:
[submodule "vendor/plugins/open_flash_chart_2"]
path = vendor/plugins/open_flash_chart_2
url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
มันจะทำให้รายการที่คล้ายกันในพื้นที่เก็บข้อมูลหลักของคุณ.git/config
(ไม่มีการpath
ตั้งค่า)
ยอมรับและคุณจะได้รับ submodule ที่เหมาะสม เมื่อคุณโคลนที่เก็บ (หรือการผลักดันเพื่อ GitHub และโคลนจากที่นั่น) คุณควรจะสามารถที่จะเริ่มต้นใหม่อีกครั้ง submodule git submodule update --init
ผ่าน
แทนที่ด้วยเนื้อหาธรรมดา
ขั้นตอนถัดไปจะถือว่าพื้นที่เก็บข้อมูลย่อยของคุณvendor/plugins/open_flash_chart_2
ไม่มีประวัติท้องถิ่นใด ๆ ที่คุณต้องการเก็บไว้ (เช่นทั้งหมดที่คุณสนใจคือแผนผังการทำงานปัจจุบันของที่เก็บย่อยไม่ใช่ประวัติ)
หากคุณมีประวัติโลคัลในที่เก็บย่อยที่คุณสนใจคุณควรสำรองข้อมูล.git
ไดเรกทอรีของที่เก็บย่อยก่อนที่จะลบในคำสั่งที่สองด้านล่าง (นอกจากนี้ให้พิจารณาตัวอย่างทรีย่อย gitด้านล่างซึ่งเก็บรักษาประวัติของ HEAD ของที่เก็บย่อย)
git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2
เวลานี้เมื่อเพิ่มไดเรกทอรีมันไม่ใช่ที่เก็บย่อยดังนั้นไฟล์จะถูกเพิ่มตามปกติ น่าเสียดายเนื่องจากเราลบ.git
ไดเรกทอรีไม่มีวิธีที่ง่ายสุด ๆ ในการอัปเดตสิ่งต่างๆด้วยแหล่งเก็บข้อมูลต้นฉบับ
คุณอาจลองใช้การรวมทรีย่อยแทน การทำเช่นนั้นจะช่วยให้คุณสามารถดึงการเปลี่ยนแปลงจากแหล่งเก็บข้อมูลได้อย่างง่ายดายในขณะที่เก็บไฟล์“ แบน” ไว้ในที่เก็บของคุณ (ไม่มีการส่งข้อมูลย่อย) คำสั่งgree subtreeบุคคลที่สามเป็นตัวหุ้มที่ดีรอบ ๆ ฟังก์ชันการรวมทรีย่อย
git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history
ต่อมา:
git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master
git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request
ทรีย่อย gitยังมี--squash
ตัวเลือกที่ช่วยให้คุณหลีกเลี่ยงการรวมประวัติของที่เก็บซอร์สในประวัติของคุณ แต่ยังช่วยให้คุณสามารถดึงการเปลี่ยนแปลงต้นน้ำ