Git submodule add: ปัญหา“ พบไดเร็กทอรี git ในเครื่อง”


209

ฉันพยายามเรียนรู้วิธีใช้ git รวมถึงคำgit submoduleสั่งย่อยด้วย ฉันตั้งค่าเซิร์ฟเวอร์ที่ฉันสามารถโฮสต์พุชและดึงที่เก็บ git โดยใช้ SSH ได้แล้ว ฉันสร้างที่เก็บ git หลัก "Travail" บนเซิร์ฟเวอร์นี้ซึ่งฉันต้องการใส่โครงการทั้งหมดของฉันเป็นโมดูลย่อย

ในที่เก็บ Travail ของฉันฉันได้เพิ่มโปรเจ็กต์ของฉันเป็นโมดูลย่อยแล้วที่tools/libft: ฉันสามารถพัฒนาโมดูลย่อยนี้เพื่อผลักดันและดึงมันได้

แต่เมื่อฉันพยายามเพิ่มโมดูลย่อยอื่น (ชื่อ fdf จาก fdf.git บนเซิร์ฟเวอร์ของฉัน) ฉันได้รับปัญหาต่อไปนี้:

git submodule add ssh://XXX.XXX.XXX.XXX:XXXXX/opt/git/fdf.git projets/fdf

พบไดเร็กทอรี git สำหรับ 'projets / fdf' ในเครื่องพร้อมกับ remote (s): origin ssh: //git@XXX.XXX.XXX.XXX: XXXXX / opt / git / fdf.git หากคุณต้องการใช้ git ภายในเครื่องนี้ซ้ำ ไดเรกทอรีแทนที่จะโคลนอีกครั้งจาก ssh: //XXX.XXX.XXX.XXX: XXXXX / opt / git / fdf.git ใช้ตัวเลือก '--force' หากไดเร็กทอรี git ภายในไม่ใช่ repo ที่ถูกต้องหรือคุณไม่แน่ใจว่าหมายถึงอะไรให้เลือกชื่ออื่นที่มีตัวเลือก '--name'

จริงๆแล้วไม่มีไดเร็กทอรีย่อยใน projets/

ฉันอ่านในเธรดอื่นว่าฉันควรใช้git submodule syncหรือแก้ไขไฟล์. gitmodules ซึ่ง URL ไปยังที่เก็บต้นทางของโมดูลย่อยของฉันอาจมีการเปลี่ยนแปลง

แต่ไฟล์. gitmodules ของฉันมีเฉพาะข้อมูลเกี่ยวกับโมดูลย่อยแรกของฉัน (tools / libft) ไม่เกี่ยวกับ projets / fdf:

[submodule "tools/libft"]
    path = tools/libft
    url = ssh://git@XXX.XXX.XXX.XXX:XXXXX/opt/git/libft.git

ในฐานะนักเรียนฝรั่งเศสฉันอาจพลาดอะไรบางอย่างในเอกสารภาษาอังกฤษที่ฉันมี แต่ฉันค้นหาและไม่เข้าใจว่าทำไมฉันถึงได้รับปัญหานี้

ฉันจะดีใจถ้าฉันจะได้รับการแก้ไข แต่เพียงแค่คำอธิบายก็จะเป็นประโยชน์เช่นกัน


การแก้ไขเล็กน้อย: เป็น 'ที่เก็บ' ไม่ใช่ 'ที่เก็บเงิน' ไม่ใช่คำตอบจริงๆ แต่ถ้าโครงการต่างๆไม่ขึ้นต่อกันมันจะเป็นการดีกว่าที่แต่ละโครงการจะมี repo ของตัวเองแทนที่จะเป็นโมดูลย่อย
jcm

ขอบคุณฉันแก้ไขแล้ว ฉันรู้ แต่ฉันต้องการรวบรวมงานทั้งหมดของฉันใน repo เดียวกัน แต่เป็นโครงการแยกต่างหาก เป็นทางเลือกที่จะอัปเดตงานทั้งหมดของฉันเมื่อฉันจากบ้านไปโรงเรียนและในทางกลับกัน (และเพื่อเรียนรู้วิธีใช้เครื่องมือเหล่านี้ฉันอยากรู้อยากเห็น;))
vmonteco

ความอยากรู้อยากเห็นเป็นเหตุผลที่ดีเสมอ! :) ที่แปลกคือ แน่ใจไหมว่ายังไม่ได้เพิ่มโมดูลย่อยมาก่อน
jcm

ไม่ได้อยู่ใน Travail / และฉันไม่มีproblèmeที่จะโคลน fdf.git ใน ~ / ใน Travail / ฉันไม่พบร่องรอยของ fdf เพียงแค่ libft: /
vmonteco

5
เดี๋ยวก่อนฉันมองเข้าไป/Travail/.git/modules/projets/และพบfdfไดเรกทอรี สิ่งนี้ดูเหมือนจะไม่อยู่ในโครงสร้างการทำงาน แต่เป็นการกระทำที่เก่ากว่า สามารถสร้างปัญหาได้หรือไม่
vmonteco

คำตอบ:


480

ฉันมาที่โพสต์ SO นี้โดยพยายามเพิ่มโมดูลย่อยที่มีเส้นทางเดียวกับโมดูลย่อยที่ฉันเพิ่งลบไป

นี่คือสิ่งที่ได้ผลสำหรับฉันในที่สุด ( บทความนี้ช่วยได้มาก ):

หากคุณยังไม่ได้เรียกใช้git rm --cached path_to_submodule(ไม่มีเครื่องหมายทับ) ให้rm -rf path_to_submoduleทำเช่นนั้น!

จากนั้น:

  1. ลบบรรทัดที่เกี่ยวข้องออกจาก.gitmodulesไฟล์ เช่นลบสิ่งเหล่านี้:

    [submodule "path_to_submodule"] path = path_to_submodule url = https://github.com/path_to_submodule

  2. ลบส่วนที่เกี่ยวข้องจาก. git / config เช่นลบสิ่งเหล่านี้:

    [submodule "path_to_submodule"] url = https://github.com/path_to_submodule

  3. rm -rf .git/modules/path_to_submodule

จากนั้นคุณสามารถ:

git submodule add https://github.com/path_to_submodule


52
สิ่งนี้มีประโยชน์มากเพราะฉันไม่พบสิ่งอื่นที่ใช้ได้ผล ความแตกต่างที่สำคัญจากคำแนะนำอื่น ๆ คือขั้นตอนที่ # 3 ของคุณ ขอบคุณ!
AndroidDev

8
ขั้นตอนที่ 2 และ 3 เป็นสิ่งจำเป็นสำหรับฉัน
U007D

8
ขั้นตอนที่ 3 เป็นสิ่งจำเป็นสำหรับฉัน แต่เหตุใดจึงมีโมดูลย่อยอยู่ที่นั่นด้วย
Crt

1
สำหรับฉันฉันข้ามขั้นตอนที่ 1 & 2 (ซึ่งมีการตั้งค่าที่ถูกต้องอยู่แล้ว) และขั้นตอนที่ 3 แก้ไขให้ฉัน (ฉันทำขั้นตอนgit rmและrm -rfขั้นตอนเริ่มต้นไปแล้ว)
Rock Lee

2
แม้แต่ขั้นตอนที่ 3 ก็ไม่ได้ผลสำหรับฉัน ฉันมีโมดูลย่อยเพียงโมดูลเดียวดังนั้นฉันจึงลบทั้งหมด.git/modulesและมันก็ใช้งานได้
ACH

52

ฉันลองวิธีแก้ปัญหาของ jbmilgrom โดยเฉพาะฉันลองgit rm --cacheแล้วและนั่นก็ไม่ได้ผลสำหรับฉันเช่นกันเนื่องจากไม่มีไดเร็กทอรี / โมดูลย่อย สิ่งที่ได้ผลสำหรับฉันคือ:

  1. rm -rf .git/modules/blah
  2. git submodule add git://path.to.new

ฉันทำสิ่งนี้หลังจากลอง--forceใช้git submoduleคำสั่งและrmไดเร็กทอรีอื่น ๆ ทั้งหมดดันไปที่ master etc ... ไม่มีไดเร็กทอรีและไม่มีเหตุผลสำหรับแคช ปรากฎ.git/modulesว่าเป็นที่ที่ข้อผิดพลาดนี้โกหก


15

คุณอาจลบออก'projets/fdf'จากดิสก์ แต่ที่เก็บ Git ของคุณยังมีอยู่ ใช้git rm -rf projets/fdfเพื่อลบออกจาก Git จากนั้นยอมรับการเปลี่ยนแปลง หลังจากนั้นคุณจะสามารถเพิ่มโฟลเดอร์นี้เป็นโมดูลย่อยได้


มันใช้งานได้ :) ขอบคุณ ฉันคิดว่าฉันทำผิดพลาดนี้จริงๆ
vmonteco

21
ฉันได้รับแจ้งว่าไม่มีไดเร็กทอรีเมื่อฉันทำสิ่งนี้ ดูเหมือนว่าจะมีอยู่และไม่มี: /
Nathan Hornby

41
@ tom-mcfarlin ในที่สุด Imanually ลบบรรทัดจาก. gitmodule และโฟลเดอร์จาก. git / โมดูลจากนั้นให้ฉันเพิ่มโมดูลย่อยใหม่ อาจจะมีวิธีที่ดีกว่านี้ แต่ฉันหมดเวลาแล้ว ถ้าคุณจะไปทางนี้ฉันขอแนะนำให้คุณทำการสำรองข้อมูลให้ดีและโปรดอย่าตำหนิฉันถ้ามันผิดพลาดสำหรับคุณ โชคดี.
sparklos

5
ขอบคุณฉันพบในโพสต์อื่นเพื่อลบโฟลเดอร์ออกจาก. git / module และนั่นก็ใช้ได้ผลสำหรับฉัน ทำให้รู้สึกว่านั่นคือสิ่งที่ข้อผิดพลาดกล่าวคือความขัดแย้ง ... ฉันไม่รู้ถึงโฟลเดอร์นั้น
Tom McFarlin

10
@NathanHornby @Sparklos @TomMcFarlin - ใน git เวอร์ชันล่าสุดคุณจะพบว่า git-submodule เพิ่มไดเร็กทอรีในโฟลเดอร์. git ตัวอย่างเช่นหากคุณอยู่ในไดเร็กทอรี/tmp/repoให้เรียกใช้git submodule add ../otherrepo.gitคุณจะเห็น/tmp/repo/.git/modules/otherrepoโฟลเดอร์นั้นอยู่ นั่นคือสิ่งที่เป็นปัญหาสำหรับฉัน ฉันลบโฟลเดอร์นั้นออกจาก. git ด้วยตนเองและทุกอย่างก็ใช้ได้
Alexander Bird

13

หากคุณลบไดเร็กทอรีโมดูลย่อยไปแล้วเช่นฉันทำตามคำแนะนำที่เหลือของ jbmilgrom กุญแจสำคัญคือrm -rf .git/modules/path_to_submoduleแต่ไปข้างหน้าและสำรองไดเร็กทอรี repo หลักทั้งหมดของคุณก่อนทั้งหมดของคุณครั้งแรก

หากคุณมีโมดูลย่อยเพียงหน่วยเดียวให้ลบ .gitmodules


4

สองคำสั่งนี้ใช้ได้กับฉัน

rm path/to/submodule -rf
rm .git/modules/path/to/module -rf

นี้. ดูเหมือนว่าจะมีสองวิธีในการสร้างโมดูลย่อย ในตอนหนึ่งของพวกเขาโฟลเดอร์ย่อยเท่านั้นที่จะมีไฟล์ .git เดียวที่เพียงแค่จุดไปยังไดเรกทอรีใน superproject .git/modules/ที่เริ่มต้นด้วย ในนั้นมีโฟลเดอร์ที่เก็บที่เก็บสำหรับโมดูลย่อย การลบที่เก็บนั้นช่วยแก้ปัญหาให้ฉันได้ในขณะที่คำตอบที่ยอมรับไม่ได้
William Randokun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.