ปัญหาเกี่ยวกับการเพิ่มรหัสทั่วไปเป็น git submodule:“ มีอยู่แล้วในดัชนี”


225

ฉันใหม่เพื่อคอมไพล์และจะขอบคุณความช่วยเหลือในการเพิ่ม submodules ฉันได้รับสองโครงการที่ใช้รหัสทั่วไปร่วมกัน รหัสที่ใช้ร่วมกันถูกคัดลอกลงในสองโครงการ ฉันสร้าง repo คอมไพล์แยกสำหรับรหัสทั่วไปและลบมันออกจากโครงการโดยมีแผนที่จะเพิ่มมันเป็น submodule git

ฉันใช้ตัวเลือกเส้นทางของ submodule git เพิ่มเพื่อระบุโฟลเดอร์:

git submodule add url_to_repo projectfolder

แต่มีข้อผิดพลาด:

'projectfolder' already exists in the index"

นี่คือโครงสร้างที่ต้องการของที่เก็บของฉัน:

repo
|-- projectfolder
    |-- folder with common code

เป็นไปได้ที่จะเพิ่ม god submodule โดยตรงใน repo หรือในโฟลเดอร์ใหม่ที่นั่น แต่ไม่ได้อยู่ใน projectfolder ปัญหาคือมันต้องอยู่ใน projectfolder จริงๆ .. ฉันจะทำอย่างไรกับเรื่องนี้และฉันเข้าใจผิดอะไรเกี่ยวกับตัวเลือก path ของ god submodule


คุณได้อะไรถ้าคุณทำgit ls-files --stage projectfolder?
Mark Longair

ฉันได้รับรายชื่อเนื้อหาทั้งหมดที่เริ่มต้นด้วย 100644
Vanja

เกี่ยวข้อง: stackoverflow.com/questions/12696919/…
Julio Marins

8
สำหรับฉันทำgit rmในโฟลเดอร์ที่มีอยู่ช่วย: |
rogerdpack

คำตอบ:


343

ฉันเกรงว่าจะมีข้อมูลไม่เพียงพอในคำถามของคุณเพื่อให้แน่ใจว่าเกิดอะไรขึ้นเนื่องจากคุณยังไม่ได้ตอบคำถามติดตาม แต่สิ่งนี้อาจช่วยได้ในทุกกรณี

ข้อผิดพลาดหมายความว่าprojectfolderมีการจัดเตรียมไว้แล้ว ("มีอยู่แล้วในดัชนี") หากต้องการทราบว่าเกิดอะไรขึ้นที่นี่ลองทำรายการทุกอย่างในดัชนีใต้โฟลเดอร์นั้นด้วย:

git ls-files --stage projectfolder

projectfolderคอลัมน์แรกของการส่งออกที่จะบอกคุณว่าสิ่งที่ประเภทของวัตถุที่อยู่ในดัชนีที่ (ดูเหมือนว่าโหมดไฟล์ Unix แต่มีความหมายพิเศษในคอมไพล์)

ฉันสงสัยว่าคุณจะเห็นสิ่งที่ชอบ:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(เช่นบรรทัดที่ขึ้นต้นด้วย160000) ซึ่งในกรณีนี้พื้นที่เก็บข้อมูลprojectfolderได้ถูกเพิ่มเป็น "gitlink" แล้ว หากไม่ปรากฏในผลลัพธ์ของgit submoduleและคุณต้องการเพิ่มใหม่เป็น submodule คุณสามารถทำได้:

git rm --cached projectfolder

... เพื่อไม่ขึ้นเวทีจากนั้น:

git submodule add url_to_repo projectfolder

... เพื่อเพิ่มที่เก็บเป็น submodule

อย่างไรก็ตามอาจเป็นไปได้ว่าคุณจะเห็น blobs หลายรายการ (ด้วยโหมดไฟล์100644และ100755) ซึ่งจะแนะนำให้ฉันว่าคุณไม่ได้ unstage ไฟล์ในprojectfolderก่อนที่จะคัดลอกพื้นที่เก็บข้อมูลใหม่เข้าที่ หากเป็นกรณีนี้คุณสามารถทำสิ่งต่อไปนี้เพื่อเลิกไฟล์ทั้งหมดเหล่านั้น:

git rm -r --cached projectfolder

... แล้วเพิ่ม submodule ด้วย:

git submodule add url_to_repo projectfolder

12
ขอบคุณทำเครื่องหมายสำหรับคำตอบโดยละเอียดของคุณ ฉันทำ "git rm -r - projectfolder ที่แคชไว้" และพยายามแนบ submodule อีกครั้ง อย่างไรก็ตามเวลานี้ฉันได้รับข้อผิดพลาด rmessage "'projectfolder' มีอยู่แล้วและไม่ใช่ repo git ที่ถูกต้อง"
Vanja

3
@Vanja: นั่นแสดงว่าprojectfolderไม่มี.gitไดเรกทอรี มันฟังจากคำถามของคุณราวกับว่าคุณได้สร้างพื้นที่เก็บข้อมูลใหม่สำหรับprojectfolderที่อื่นและคัดลอกไปไว้ในสถานที่ แต่ชัดเจนว่าไม่ใช่กรณี คุณจะต้องย้ายที่มีอยู่projectfolderออกไปแล้วคัดลอกพื้นที่เก็บข้อมูลใหม่ (พร้อมด้วย.gitไดเรกทอรี) ไปยังสถานที่ก่อนที่จะเพิ่มเป็น submodule หรือถ้าคุณได้ผลักมันไปยังพื้นที่เก็บข้อมูลที่แสดงโดยurl_to_repoคุณก็สามารถย้ายprojectfolderออกไปแล้วเพิ่ม submodule จาก URL นั้น
Mark Longair

คำตอบที่ดีเลิศ +1 ตลอดทาง
abbood

สิ่งนี้ช่วยฉันได้มาก ขอบคุณ!
Evan Moran

1
นี่คือสิ่งที่ฉันทำซึ่งเป็นกระบวนการ 3 ขั้นตอนขั้นตอนที่ 1: git rm -r - แคช src / test / ทรัพยากร /, ขั้นตอนที่ 2: ลบไดเรกทอรีทรัพยากรที่มีอยู่ไปยังที่อื่น ๆ ขั้นตอนที่ 3: git submodule เพิ่ม git ซับ ทดสอบ / ทรัพยากร
vikramvi

52

การลบ submodule ด้วยตนเองเกี่ยวข้องกับจำนวนขั้นตอนและสิ่งนี้ใช้ได้สำหรับฉัน

สมมติว่าคุณอยู่ในไดเรกทอรีรากของโครงการและชื่อโมดูล git ตัวอย่างคือ "c3-pro-ios-framework"

ลบไฟล์ที่เกี่ยวข้องกับ submodule

rm -rf .git/modules/c3-pro-ios-framework/

ลบการอ้างอิงใด ๆ เพื่อ submodule ในการกำหนดค่า

vim .git/config

ป้อนคำอธิบายรูปภาพที่นี่

ลบ. gitmodules

rm -rf .gitmodules

ลบออกจากแคชโดยไม่มี "git"

git rm --cached c3-pro-ios-framework

เพิ่ม submodule

git submodule add https://github.com/chb/c3-pro-ios-framework.git

2
โพสต์ที่ยอดเยี่ยมใช้งานได้ดี ยอดเยี่ยมในการแบ่งปันของคุณครับ ดีจริงๆ.
gabn88

1
ฉันพยายามที่จะแสดงรายการ submodules ผ่านgit submoduleหลังจากการลบและก่อนที่จะเพิ่มและมันทำให้ฉันมีข้อผิดพลาดกระทำการลบดูแลมัน
เมห์เม็ต

1
ฉันจะโหวต 50x นี้ได้ถ้าทำได้; คุณเพิ่งบันทึกวันของฉัน!
อาจารย์เจมส์

touch .gitmodules(จำเป็นต้องอยู่ในแผนผังการทำงานดังนั้นโปรดลบมันออก แต่คุณต้องเพิ่มมันอีกครั้ง) โพสต์ btw ครับ สิ่งเดียวที่ทำงานในที่นี่
Torxed

มันเป็น.gitไดเรกทอรีที่ยังมีเศษเหลืออยู่สำหรับฉัน มันใช้งานได้ดีมาก ขอบคุณ.
Kevin Anderson

44

คุณต้องลบที่เก็บ submodule git (projectfolder ในกรณีนี้) ก่อนสำหรับเส้นทาง git

rm -rf projectfolder

git rm -r projectfolder

แล้วเพิ่ม submodule

git submodule add <git_submodule_repository> projectfolder

4
git submodule add --force <git_submodule_repository>ทำงานให้ฉันเพื่อให้ชื่อ submodule เดียวกัน
Tenfrow

1
ขอบคุณ !! ฉันไม่ต้องเพิ่มในโฟลเดอร์โครงการฉันเพิ่งเปลี่ยนเป็นไดเรกทอรีย่อยและโคลนจากตรงนั้น
Tony Fraser

32

ฉันมีปัญหาเดียวกันและหลังจากชั่วโมงของการค้นหาพบคำตอบ

ข้อผิดพลาดที่ฉันได้รับแตกต่างกันเล็กน้อย: <path> already exists and is not a valid git repo(และเพิ่มที่นี่สำหรับค่า SEO)

การแก้ปัญหาคือการไม่สร้างไดเรกทอรีที่จะบ้าน submodule ไดเรกทอรีจะถูกสร้างขึ้นเป็นส่วนหนึ่งของgit submodule addคำสั่ง

นอกจากนี้ยังคาดว่าอาร์กิวเมนต์จะสัมพันธ์กับรูทหลักของ repo ไม่ใช่ไดเรกทอรีทำงานของคุณดังนั้นระวัง

คำตอบสำหรับตัวอย่างด้านบน:

  1. มันก็โอเคที่จะมีการทำธุรกรรมซื้อสินค้าแม่ของคุณแล้วโคลน
  2. ตรวจสอบให้แน่ใจcommon_codeไดเรกทอรีไม่ได้อยู่
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( สังเกตเครื่องหมายทับที่ต้องการ )
  5. ฟื้นฟูสติ

ฉันหวังว่าสิ่งนี้จะช่วยใครบางคนเนื่องจากมีข้อมูลน้อยมากที่จะพบที่อื่นเกี่ยวกับเรื่องนี้


1
ขั้นตอนที่ 4 ควรเริ่มต้นgit submodule addและไม่จำเป็นต้องใช้เครื่องหมายทับต่อท้าย
ใช้ได้

แก้ไขการพิมพ์ผิด ฉันลองมันอีกครั้งและเครื่องหมายสแลชต่อท้ายสร้างความแตกต่างให้ฉัน ฉันกำลังใช้ zsh หากนั่นมีผลกระทบใด ๆ
ไม่ได้กำหนด

วิธีนี้แก้ไขปัญหาของฉัน (สร้างไดเรกทอรีด้วยคำสั่งเพิ่ม submodule) ขอบคุณ!
jackJoe

18

ถ้ามีโฟลเดอร์ชื่อxภายใต้การควบคุมคอมไพล์ที่คุณต้องการเพิ่ม submodule ชื่อเดียวกันคุณควรลบโฟลเดอร์xและกระทำมันเป็นครั้งแรก

อัปเดตโดย @ ujjwal-singh:

ไม่จำเป็นต้องมีการผูกมัดทำพอเพียงเตรียมความพร้อม .. git add/git rm -r


ความมุ่งมั่นคือสิ่งที่ฉันพลาด คำตอบสั้น ๆ แต่ถูกต้องหนึ่ง!
Qqwy

3
ไม่จำเป็นต้องมีการgit addgir rm -r
ผูกมัดทำ

3

เพียงชี้แจงให้ชัดเจนในภาษามนุษย์สิ่งที่เกิดข้อผิดพลาดพยายามบอกคุณ:

คุณไม่สามารถสร้างที่เก็บในโฟลเดอร์นี้ซึ่งถูกติดตามอยู่แล้วในที่เก็บหลัก

ตัวอย่างเช่น: คุณมีโฟลเดอร์ชุดรูปแบบที่เรียกAwesomeThemeว่าเป็นที่เก็บข้อมูลเฉพาะคุณลองถ่ายโอนลงในพื้นที่เก็บข้อมูลหลักของคุณโดยตรงgit submodule add sites/themesและคุณจะได้รับสิ่งนี้"AwesomeTheme" index already existsและคุณได้รับนี้

คุณเพียงแค่ต้องแน่ใจว่าไม่มีอยู่แล้ว sites/themes/AwesomeThemeการติดตามเวอร์ชันของที่เก็บหลักอยู่ดังนั้นจึงสามารถสร้าง submodule ได้

ดังนั้นเพื่อแก้ไขในพื้นที่เก็บข้อมูลหลักของคุณหากคุณมีsites/theme/AwesomeThemeไดเรกทอรีว่างแล้วลบออก หากคุณได้ทำคอมมิชชันกับไดเร็กตอรี่sites/theme/AwesomeThemeในที่เก็บหลักของคุณคุณจะต้องทำการล้างประวัติทั้งหมดด้วยคำสั่งดังนี้:

git filter-branch --index-filter \
              'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

ตอนนี้คุณสามารถเรียกใช้ git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

เนื่องจากพื้นที่เก็บข้อมูลหลักไม่เคยเห็นอะไรเลย (ดัชนี aka) sites/themes/AwesomeThemeมาก่อนตอนนี้มันสามารถสร้างมันได้


1

ฉันทำให้มันทำงานโดยใช้วิธีอื่น เริ่มต้นด้วย repo ที่ว่างเปล่าเพิ่ม submodule ในโฟลเดอร์ใหม่ที่ชื่อว่า "projectfolder / common_code" หลังจากนั้นเป็นไปได้ที่จะเพิ่มรหัสโครงการใน projectfolder รายละเอียดดังแสดงด้านล่าง

ในประเภท repo ที่ว่างเปล่า:

git submodule add url_to_repo projectfolder/common_code

ที่จะสร้างโครงสร้างโฟลเดอร์ที่ต้องการ:

repo
|-- projectfolder
    |-- common_code

ตอนนี้เป็นไปได้ที่จะเพิ่ม submodules เพิ่มเติมและสามารถเพิ่มรหัสโครงการใน projectfolder

ฉันยังไม่สามารถพูดได้ว่าทำไมมันถึงได้ทำงานแบบนี้และไม่ใช่อีกแบบ


0

ไม่ทราบว่าสิ่งนี้มีประโยชน์หรือไม่แม้ว่าฉันจะมีปัญหาเดียวกันเมื่อพยายามส่งไฟล์ของฉันจากภายใน IntelliJ 15 ในที่สุดฉันก็เปิด SourceTree และในนั้นฉันก็สามารถส่งไฟล์ได้ แก้ไขปัญหา. ไม่จำเป็นต้องออกคำสั่งแฟนซี git ใด ๆ เพียงกล่าวถึงในกรณีที่ใครก็ตามมีปัญหาเดียวกัน


0

ไปที่โฟลเดอร์ที่เก็บ ลบ submodules ที่เกี่ยวข้องจาก. gitmodules เลือกแสดงไฟล์ที่ซ่อน ไปที่โฟลเดอร์. git ลบ submodules จากโฟลเดอร์ module และตั้งค่า


0

สิ่งนี้จะเกิดขึ้นหากไฟล์. git หายไปในเส้นทางเป้าหมาย git clean -f -dมันขึ้นกับผมหลังจากที่ผมดำเนินการ

ฉันต้องลบโฟลเดอร์เป้าหมายทั้งหมดที่แสดงในข้อความและดำเนินการ git submodule update --remote


-18

ใน dir git ของคุณสมมติว่าคุณซิงค์การเปลี่ยนแปลงทั้งหมดแล้ว

rm -rf .git 

rm -rf .gitmodules

จากนั้นทำ:

git init
git submodule add url_to_repo projectfolder

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