จะกำจัดสถานะ Git submodules ที่ไม่ได้ติดตามได้อย่างไร


149

ดูเหมือนว่าฉันจะไม่สามารถกำจัดเนื้อหาที่ไม่ได้ติดตามได้ใน submodules ของ Git วิ่งgit statusผลผลิต:

# เกี่ยวกับอาจารย์สาขา
# การเปลี่ยนแปลงที่ไม่ได้จัดเตรียมไว้สำหรับการส่งมอบ:
# (ใช้ "git add ... " เพื่ออัปเดตสิ่งที่จะเกิดขึ้น)
# (ใช้ "ชำระเงิน git - ... " เพื่อยกเลิกการเปลี่ยนแปลงในไดเรกทอรีการทำงาน)
# (กระทำหรือทิ้งเนื้อหาที่ไม่ได้ติดตามหรือแก้ไขใน submodules)
#
# modified: มัด / snipmate (เนื้อหาที่ไม่ได้ติดตาม)
# modified: มัด / รอบทิศทาง (เนื้อหาที่ไม่ได้ติดตาม)
# modified: มัด / ต่อท้าย - ช่องว่าง (เนื้อหาที่ไม่ได้ติดตาม)
# modified: มัด / zencoding (เนื้อหาที่ไม่ได้ติดตาม)
#
ไม่มีการเพิ่มการเปลี่ยนแปลงที่จะกระทำ (ใช้ "git เพิ่ม" และ / หรือ "git กระทำ -a")

การเพิ่ม--ignore-submodulesพารามิเตอร์จะซ่อนข้อความเหล่านี้ แต่ฉันสงสัยว่ามีวิธีที่จะกำจัดสิ่งสกปรกนี้ด้วยวิธีที่เหมาะสมกว่าแกนกลางหรือไม่


3
คำตอบนี้: stackoverflow.com/a/5127213/199649ทำให้มีตัวเลือกเพิ่มเติม
charlax

คำตอบ:


95

เนื่องจากสถานะ git รายงานเนื้อหาที่ไม่ได้ติดตามวิธีที่แท้จริงในการมีสถานะที่สะอาดจะเข้าสู่แต่ละ submodules และ:

  • เพิ่มและกระทำเนื้อหาที่ไม่ได้ติดตาม
  • หรืออ้างอิงเนื้อหาที่ไม่ได้ติดตามใน.gitignoreแต่ละโมดูล
  • หรือคุณสามารถเพิ่มเนื้อหาละเว้นเดียวกันกับของ submodule .git/info/excludeเป็นpeci1รายงานในการแสดงความคิดเห็น
  • หรือเพิ่มความสกปรกให้กับข้อกำหนดของ submodule ดังที่กล่าวไว้ในคำตอบของezraspectre (upvoted)

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • หรือเพิ่มไฟล์ทั่วโลก .gitignore (มักจะ~/.gitignore-global) อย่างเช่น.DS_StoreหรือในกรณีของฉันCarthage/Buildตามที่รายงานโดยMariánČernýในการแสดงความคิดเห็น ดู.gitginoreหน้าคน :

รูปแบบที่ผู้ใช้ต้องการ Git จะไม่สนใจในทุกสถานการณ์ (เช่นการสำรองข้อมูลหรือไฟล์ชั่วคราวที่สร้างขึ้นโดยบรรณาธิการของผู้ใช้เลือก) มักจะไปลงในแฟ้มที่ระบุโดยในของผู้ใช้core.excludesFile ค่าเริ่มต้นของมันคือ~/.gitconfig $XDG_CONFIG_HOME/git/ignoreหาก$XDG_CONFIG_HOMEไม่ได้ตั้งค่าหรือว่างเปล่า$HOME/.config/git/ignoreจะใช้แทน


5
+1, ฉันพร้อมที่จะกรีดร้องจนกว่าฉันจะพบสิ่งนี้ ... จากนั้นการตระหนักว่า.DS_Storeไฟล์ถูกสร้างขึ้นโดยอัตโนมัติ (โดย OS X) ในหนึ่งใน submodules ของฉันทำให้ฉันไม่สามารถทำโครงการหลักได้ หาเรื่อง! ถึงเวลาอัปเดต.gitignore...
Courtney Christensen

ใช้ Xcode ฉันยังพบว่ามีประโยชน์ในการเพิ่ม * .xcuserdatad ไปยังไฟล์. gitignore-global สิ่งนี้ป้องกันไม่ให้คอมไพล์พยายามติดตามค่ากำหนด Xcode ในเครื่อง
Roy Sharon

หากคุณไม่มีสิทธิ์ผลักดันไปยัง submodule คุณไม่สามารถแบ่งปันการเปลี่ยนแปลงของคุณไปยัง submodule กับผู้ใช้คนอื่น ๆ ของ repo หลัก คำตอบ @ quincyglenn ของดูเหมือนว่าจะทำงานในกรณีเช่นนี้
Drew Noakes

1
@VonC คำตอบอย่างใดอย่างหนึ่งขึ้นอยู่กับสถานการณ์และความชอบ ฉันต้องการเน้นความแตกต่างที่นี่เพื่ออ้างอิงถึงผู้อื่น BTW ขอบคุณสำหรับคำตอบมากมายของคุณเกี่ยวกับ Git ที่นี่ใน SO - คุณได้ช่วยฉันหลายครั้ง
Drew Noakes

2
คุณสามารถทำได้โดยไม่ต้องทั้งยอมรับและสร้าง. gitignore (ซึ่งตัวมันเองจะไม่ถูกติดตาม) เปิดของ submodule .git/info/excludeและเพิ่มบรรทัดที่เพิกเฉยที่นั่น (ทำงานเหมือน. gitignore แต่ไม่ได้เป็นส่วนหนึ่งของที่เก็บที่แชร์)
Martin Pecka

144

ฉันพบโพสต์บล็อกนี้เพื่อทำงานโดยรวม โดยการเพิ่มignore = dirtyตัวเลือกให้กับแต่ละรายการใน.gitmodulesไฟล์

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty

โซลูชันที่ฉันต้องการเนื่องจากเป็นระบบอัตโนมัติอย่างง่ายดาย
กีตาร์ที่มีความร้ายแรง

24
มีมูลค่าการกล่าวขวัญว่าignore = untrackedมีอยู่และแสดงไฟล์ที่ถูกติดตามที่แก้ไขแล้ว แต่ไม่ใช่ไฟล์ที่ไม่ได้ติดตาม มันต้องการจะดีถ้ามีการตั้งค่าระดับโลกสำหรับการนี้ submodules ทั้งหมด ...
naught101

12

นอกจากนี้คุณยังสามารถไปที่ submodule dir แต่ละอันและทำหน้าที่เป็นคอมไพล์แยก ตัวอย่างเช่น:

cd my/project/submodule
git status

... / รับรายการของไฟล์ที่ถูกแก้ไข /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

คุณยังสามารถอัพเดต repododo ระยะไกลของคุณด้วย

git submodule update

หลังจากนั้น


5
คุณอาจไม่ต้องการทำgit add .โดยไม่ตรวจสอบไฟล์ที่ถูกแก้ไข ส่วนใหญ่แล้วการเปลี่ยนแปลงที่เกิดขึ้นนั้นเป็น.DS_Storeไฟล์ที่เพิ่มเข้ามา- นี่อาจเป็นสิ่งที่คุณอาจถูกจับได้.gitignoreเช่นเดียวกับ zourtney ที่กล่าวถึงในความคิดเห็นแรกในคำตอบ
gregoltsov

ในกรณีที่คุณจริงไม่ต้องการที่จะปรับปรุง submodules git submodule update --forceและต้องการที่จะย้อนกลับไปสู่สภาพเดิมคุณอาจต้องการที่จะทำงาน
Tom

4

อาจเป็นเพราะdetached HEADในสาขา submodule ของคุณ หากเป็นกรณีนี้ไปเข้ามาในเส้นทาง submodule ของคุณ (เช่น./bundle/snipmate) git checkout masterแล้วทำงาน


2

ฉันติดปัญหานี้เมื่อวานนี้ในโครงการที่ใกล้กับ 12 submodules

git status แสดงผลลัพธ์

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

เมื่อต้องการแก้ไขข้อผิดพลาดที่ไม่ได้ติดตามเนื้อหาผมต้องลบไฟล์ที่ไม่ได้ติดตามจาก submodules ทั้งหมด (ทุกคน*.pyc, *.pyoไฟล์ที่สร้างขึ้นโดยหลาม) .gitignoreโดยใช้

เพื่อแก้ไขปัญหาอื่น ๆ ฉันต้องเรียกใช้งานgit submodule updateที่อัปเดตแต่ละ submodules


1

ในสถานการณ์ของฉันฉันโคลนโมดูลเป็นจุดเริ่มต้นสำหรับโมดูลใหม่ในสภาพแวดล้อม ZF2 ของฉัน สิ่งนี้ทำคือใส่โฟลเดอร์. git ของตัวเองลงในไดเรกทอรี

วิธีแก้ปัญหาในกรณีนี้คือการลบโฟลเดอร์. git (คุณอาจต้องแสดงไฟล์ที่ซ่อนอยู่เพื่อดู)


1

สิ่งนี้อาจเกิดขึ้นเมื่อคุณมี. git อีกอันซ่อนอยู่ในโฟลเดอร์นั้น

modified: ./../ .. (เนื้อหาที่แก้ไข, เนื้อหาที่ไม่ได้ติดตาม)

ตรวจสอบให้แน่ใจว่าไดเรกทอรีย่อยของคุณไม่มีโฟลเดอร์. git นี้

หากเป็นกรณีนี้ปัญหาสามารถแก้ไขได้ด้วยการลบโฟลเดอร์. git ด้วยตนเองจากไดเรกทอรีย่อย


1

ฉันชอบที่จะใช้SourceTreeดังนั้นทางออกสำหรับฉันคือการเปิด submodule repo ใน SourceTree ซึ่งแสดงรายการไฟล์ที่ไม่ได้ติดตามทั้งหมด ฉันเลือกกลุ่มพวกเขาทั้งหมดแล้วใช้ "ลบ"

ฉันสามารถทำสิ่งนี้ได้เพราะฉันรู้ว่าไฟล์ที่ไม่ได้ติดตามทั้งหมดไม่จำเป็นต้องใช้จริง


1

สิ่งนี้ใช้ได้ผลดีสำหรับฉัน:

git update-index --skip-worktree <path>

หากไม่สามารถใช้งานได้ให้pathnameลองชื่อไฟล์ แจ้งให้เราทราบว่าสิ่งนี้ได้ผลกับคุณเช่นกัน


-1

หากนี่เป็นปัญหาชั่วคราวคุณสามารถไปที่โฟลเดอร์ submodule และเรียกใช้git reset HEAD --hardแต่คุณจะสูญเสียการเปลี่ยนแปลงทั้งหมดภายใน submodule

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