ฉันจะแทนที่โมดูลย่อย git ด้วย repo อื่นได้อย่างไร


98

ฉันจะแทนที่โมดูลย่อย git ด้วย repo git อื่นได้อย่างไร

โดยเฉพาะฉันมีโมดูลย่อย:

  • อยู่ที่./ExternalFrameworks/TestFrameworkจุดนั้นไปยัง git repogit@github.com:userA/TestFramework.git
  • git@github.com:userB/TestFramework.gitฉันต้องการตอนนี้ชี้ไปที่

ปัญหาคือเมื่อฉันลบโมดูลย่อยด้วยวิธีการที่อธิบายไว้ที่นี่แล้วเพิ่มใหม่โดยใช้คำสั่ง

git submodule add git@github.com:userB/TestFramework.git

ฉันได้รับข้อผิดพลาดนี้:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    git@github.com:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  git@github.com:userB/TestFramework.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

คำตอบ:


128

หากตำแหน่ง (URL) ของโมดูลย่อยมีการเปลี่ยนแปลงคุณสามารถ:

  1. แก้ไข.gitmoduleไฟล์ของคุณเพื่อใช้ URL ใหม่
  2. ลบโฟลเดอร์โมดูลย่อยใน repo rm -rf .git/modules/<submodule>
  3. ลบโฟลเดอร์โมดูลย่อยในไดเร็กทอรีการทำงาน rm -rf <submodule>
  4. วิ่ง git submodule sync
  5. วิ่ง git submodule update

สามารถดูข้อมูลเพิ่มเติมได้ที่อื่น:


4
สิ่งที่ควรสังเกตอีกอย่างคือเมื่อผู้ใช้รายอื่น (ที่เคยเข้าสู่โมดูลย่อยแล้ว) ได้รับการอัปเดตของคุณพวกเขาจะต้องทำการ "ซิงค์โมดูลย่อย git" หนึ่งครั้งก่อนที่โมดูลย่อยใหม่จะใช้งานได้
joseph.hainline

2
สิ่งนี้ไม่ได้ผลสำหรับฉัน โมดูลย่อยของฉันยังคงชี้ไปที่ URL เก่าหลังจากนี้ ความคิดใด ๆ ทำไม?
Arne

34
@Arne บางทีโมดูลย่อยของคุณอาจไม่ได้เริ่มต้นอย่างถูกต้อง ฉันต้องทำrm -rf .git/modules/<submodule>ก่อนที่จะได้ผลสำหรับฉัน
David Braun

@DavidBraun ฉันมีปัญหาเช่นเดียวกับ @Arne แต่ทำgit submodule syncหลังให้rm -rf .git/modules/<submodule> fatal: Not a git repository: ../.git/modules/<submodule>เคล็ดลับใด ๆ ตอนแรกฉันสร้างโมดูลย่อยผ่านgit submodule add https://<submodule-url>ตามเอกสารคอมไพล์ ...
acannon828

1
หลังจากนั้นฉันต้อง cd ไปยังไดเร็กทอรีของโมดูลแล้วคอมไพล์เช็คเอาต์สาขาที่ฉันต้องการจากนั้นก็ดึงคอมไพล์
Nicolas Raoul

34

ขั้นแรกให้ลบโมดูลย่อยปัจจุบันด้วยวิธีการที่กล่าวถึงแล้วที่นี่ซึ่งฉันรวมไว้เพื่อความสะดวก:

  • ลบส่วนที่เกี่ยวข้องออกจาก.gitmodulesไฟล์
  • ลบส่วนที่เกี่ยวข้องออกจาก .git/config
  • เรียกใช้git rm --cached path_to_submodule(ไม่มีเครื่องหมายทับ)
  • ยอมรับและลบไฟล์โมดูลย่อยที่ไม่ได้ติดตามในขณะนี้

ตอนนี้เพิ่มโมดูลย่อยใหม่ด้วย--nameแฟล็ก สิ่งนี้จะทำให้ git เป็นชื่ออื่นที่จะใช้อ้างอิง.git/configสำหรับโมดูลย่อยเพื่อแยกความขัดแย้งกับโมดูลย่อยที่มีในอดีตซึ่งคุณยังคงต้องการใช้งานในประวัติเดิมของคุณ

พิมพ์:

git submodule add --name UpdatedTestFramework git@github.com:userB/TestFramework.git

และคุณจะโหลดโมดูลย่อยในเส้นทางที่คุณคาดหวัง


2
แม้ว่าวิธีนี้จะได้ผล แต่ก็ไม่สะอาดเท่าวิธีของทิม
joseph.hainline

4
สิ่งนี้ใช้ได้ผลสำหรับฉัน แต่ฉันก็ต้องลบ.git/modules/<path_to_submodule>ด้วย
เนท

1
--nameชื่นชมการอ้างอิงถึง ฉันไม่ทราบถึงปัญหารอบ ๆ นี้และฉันไม่สามารถแทนที่โมดูลย่อยได้จนกว่าฉันจะใช้ตัวเลือกนี้ (ขอบคุณสำหรับคำตอบของคุณ)
aknuds1

สิ่งนี้ทำให้เกิดขึ้นเป็นวิธีเดียวที่ใช้ได้ผลสำหรับฉันอย่างไรก็ตามฉันต้องการคงชื่อไดเร็กทอรีเดิมไว้ ตรวจสอบเส้นทางที่ถูกต้องและตั้งชื่อโมดูลเป็นชื่อที่ต้องการ แต่ชื่อไดเร็กทอรีการทำงานเป็นชื่อ repo ใหม่ ดังนั้นหากคุณต้องการชื่อเดียวกันคุณต้องระบุด้วยว่าท้าย url ดังนี้: git submodule add --name old-name-to-keep git@github.com:userB/new-repository.git old-name-to-keep
rgb

9

คำสั่งเหล่านี้จะทำงานบนพรอมต์คำสั่งโดยไม่แก้ไขไฟล์ใด ๆ บนที่เก็บในเครื่อง

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Dev
git submodule sync
git submodule update --init --recursive --remote

5

สิ่งที่แก้ไขสิ่งนี้สำหรับฉันคือในรูทของ git repo ของคุณ (ไม่ใช่โมดูลย่อย) ให้เรียกใช้

rm -rf .git/modules/yourmodule

จากนั้นคุณจะสามารถเพิ่มได้ตามปกติ


3

วิธีที่ง่ายที่สุดที่ฉันพบคือ:

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

ฉันไม่ชอบความคิดที่จะแก้ไข.gitmodulesด้วยตนเอง ฉันยังเขียนบล็อกโพสต์เล็กน้อยเกี่ยวกับเรื่องนี้


2

หากคุณต้องการเปลี่ยน URL ระยะไกลสำหรับโคลนนี้เท่านั้น :

git config submodule."$submodule_name".url "$new_url"

สิ่งนี้จะไม่ส่งผลกระทบต่อ.gitmodulesไฟล์ในโปรเจ็กต์หลักดังนั้นไฟล์จะไม่ถูกเผยแพร่ไปยังผู้พัฒนารายอื่น

นี้จะอธิบายว่า "บันทึกของผู้ใช้เฉพาะการเปลี่ยนแปลง" ที่นี่

อย่ารันgit submodule syncเนื่องจากจะรีเซ็ตเป็น URL เริ่มต้นอีกครั้ง

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