วิธีปัจจุบันในการลบโมดูลย่อย git คืออะไร?


92

สำหรับ git เวอร์ชัน 1.9.3 (Apple Git-50) บน mac ฉันจะลบโมดูลย่อย git ได้อย่างไร ฉันกำลังอ่านข้อมูลที่ล้าสมัยจำนวนมากซึ่งมีนักพัฒนาหลายคนบอกว่าพวกเขาใช้ไม่ได้ผล ทางปัจจุบันเป็นอย่างไร? จะgit deinit pathToSubModule ทำเคล็ดลับ?

ขั้นตอนที่ฉันคิดว่าจะใช้ได้ผลอยู่ที่นี่แต่ความคิดเห็นบอกว่าไม่เคยชิน

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

อัปเดต: ฉันอ่านแล้วว่าต่อไปนี้เป็นวิธีที่ถูกต้องใน git เวอร์ชันล่าสุดโปรดยืนยัน?

To remove a submodule added using:

git submodule add blah@blah.com:repos/blah.git lib/blah
Run:

git rm lib/blah
That's it.

For old versions of git (circa ~1.8.5) use:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

ฉันต่อสู้กับปัญหาโมดูลย่อยมาสองวันแล้ว การพัฒนามาเมื่อฉันพบนี้: forums.developer.apple.com/thread/13102 โดยทั่วไป Xcode และแอปอื่น ๆ อาจพยายามขยาย url ที่มี "~" เมื่อฉันเปลี่ยน ssh: //username@server.remoteHost.com/~/git/MyRepo.git เป็น ssh: //username@server.remoteHost.com/home/username/git/MyRepo.git (ค้นหาเส้นทางจริง บนเซิร์ฟเวอร์ของคุณ) ความประหลาดทั้งหมดหายไปภายในสิบนาที
Elise van Looij

คำตอบ:


196

คุณมีไฟล์ git submodule deinit

git submodule deinit <asubmodule>    
git rm <asubmodule>
# Note: asubmodule (no trailing slash)
# or, if you want to leave it in your working tree
git rm --cached <asubmodule>
rm -rf .git/modules/<asubmodule>

deinit

ยกเลิกการลงทะเบียนโมดูลย่อยที่กำหนดกล่าวคือลบsubmodule.$name
ส่วนทั้งหมดออก.git/configพร้อมกับโครงสร้างงาน

สายต่อไปgit submodule update, git submodule foreachและgit submodule syncจะข้าม submodules ที่ไม่ได้จดทะเบียนใด ๆ จนกว่าพวกเขาจะเริ่มต้นอีกครั้งเพื่อให้ใช้คำสั่งนี้ถ้าคุณไม่ต้องการที่จะมีการเช็คเอาท์ท้องถิ่น submodule ในต้นไม้การทำงานของคุณอีกต่อไป

หากคุณต้องการลบโมดูลย่อยออกจากที่เก็บจริงๆและยอมรับว่าใช้git rmแทน

หาก--forceระบุไว้โครงสร้างงานของโมดูลย่อยจะถูกลบออกแม้ว่าจะมีการปรับเปลี่ยนในเครื่องก็ตาม


8
ฉันต้องการล้างโมดูลย่อยสำหรับฉันและผู้ใช้คนอื่น ๆ ด้วย ดังนั้นสิ่งที่ฉันต้องการคือ git submodule deinit asubmodule; และ git rm asubmodule ?? สิ่งที่เกี่ยวกับโมดูลย่อยที่แคชของผู้ใช้รายอื่นพวกเขาจะต้องลบออกหลังจากดึงลงหรือไม่?
j2emanue

1
ฉันต้องการลบสำเนาในเครื่องของโมดูลย่อยและมันใช้งานได้สมบูรณ์ไฟล์ทั้งหมดใน subdir จะหายไป
malhal

1
คุณอาจต้องใช้rm -rf <asubmodule>หากคุณได้ตรวจสอบเวอร์ชันของที่เก็บฐานซึ่งยกเลิกการลงทะเบียนโมดูลย่อยแล้ว
Sarah Messer

8

ฉันใช้ Git เวอร์ชัน 2.16.2 และgit rmทำงานได้ดีเป็นส่วนใหญ่:

git rm path-to-submodule

คุณสามารถตรวจสอบด้วยgit statusและgit diff --cachedที่ว่านี้ deinitializes submodule และปรับเปลี่ยน.gitmodulesโดยอัตโนมัติ เช่นเคยคุณต้องยอมรับการเปลี่ยนแปลง

อย่างไรก็ตามแม้ว่าโมดูลย่อยจะถูกลบออกจากการควบคุมต้นทาง แต่.git/modules/path-to-submoduleยังคงมีที่เก็บโมดูลย่อยและ.git/configมี URL อยู่ดังนั้นคุณยังคงต้องลบโมดูลเหล่านั้นด้วยตนเอง:

git config --remove-section submodule.path-to-submodule
rm -rf .git/modules/path-to-submodule

รักษาพื้นที่เก็บข้อมูล submodule git reset --hardและการกำหนดค่าเป็นเจตนาเพื่อให้คุณสามารถยกเลิกการกำจัดด้วยเช่น


2
คำตอบล่าสุดและวิธีแก้ปัญหาที่สั้นที่สุด
TurboGuma

3

วิธีลบโมดูลย่อยอย่างปลอดภัย

(เพิ่มในhttps://stackoverflow.com/a/1260982/342794 )

  1. แสดงรายการและค้นหาส่วนโมดูลย่อยใน.gitmodulesไฟล์ vi .gitmodulesพูดผ่านทางสถานี ตัวอย่าง:

    [submodule "submodules/afnetworking"]
        path = submodules/afnetworking
        url = https://github.com/CompanyName/afnetworking.git
    
  2. โมดูลย่อยสามารถใช้กับส้อมท้องถิ่นได้ สำหรับโปรเจ็กต์ที่ทำงานมายาวนานโค้ดอาจแตกต่างจาก repo ดั้งเดิมและอาจมีการแก้ไขบางอย่าง เป็นความคิดที่ดีที่จะตรวจสอบว่าโค้ดโมดูลย่อยมีการเปลี่ยนแปลงตลอดระยะเวลาของโครงการหรือไม่ ตัวอย่าง: ดูบันทึกหากชี้ไปที่masterสาขาหรือสาขาในพื้นที่ สำรวจบันทึก git เพื่อค้นหาการแก้ไขที่ทำผ่านเทอร์มินัล โดยทั่วไปสิ่งเหล่านี้จะถูกเก็บไว้ในไดเร็กทอรีตัวอย่างของฉันภายใต้submodulesไดเร็กทอรี

    User$ cd submodules/afnetworking
    User$ git log
    
  3. ลบส่วนโมดูลย่อยออกจาก. gitmodules บันทึกไฟล์ ตัวอย่าง: git statusควรแสดงเฉพาะรายการต่อไปนี้เมื่อแก้ไขแล้ว

    modified:   .gitmodules
    
  4. จัดเวทีการเปลี่ยนแปลงด้วยgit add .gitmodules.

  5. แสดงรายการและค้นหาส่วนโมดูลย่อยใน.git/configไฟล์ vi .git/configพูดผ่านทางสถานี ตัวอย่าง:

    [submodule "submodules/afnetworking"]
        url = https://github.com/CompanyName/afnetworking.git
    
  6. ลบไฟล์ sobmodule ของ git cache การรันgit rm --cached submodules/afnetworking(ไม่มีเครื่องหมายทับ) จะลบออกได้สำเร็จ ตัวอย่าง:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. ลบไฟล์โมดูลย่อยภายใต้.gitไดเร็กทอรีด้วยrm -rf .git/modules/.... ยืนยันด้วยgit statusหลังจากนั้น

    User$ rm -rf .git/modules/submodules/afnetworking/
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
        modified:   .gitmodules
        deleted:    submodules/afnetworking
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    
  8. ยอมรับการเปลี่ยนแปลง ยืนยันgit statusหลังจากนั้น

    User$ git commit -m "Remove submodule afnetworking"
    [feature/replace-afnetworking-submodule-with-pod 70e239222] Remove submodule afnetworking
    2 files changed, 4 deletions(-)
      delete mode 160000 submodules/afnetworking
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    nothing added to commit but untracked files present (use "git add" to track)
    
  9. ลบไฟล์โมดูลย่อยที่ไม่ได้ติดตาม

    User$ rm -rf submodules/afnetworking
    
  10. ลบการอ้างอิงจากโครงการ Xcode สร้างแก้ไขปัญหาการคอมไพล์และรันไทม์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.