วิธีแก้ไข“ ข้อผิดพลาด: ดัชนีไม่ดี - ร้ายแรง: ไฟล์ดัชนีเสียหาย” เมื่อใช้ Git


611

หลังจากนั้นgit initฉันเพิ่มและส่งไฟล์บางไฟล์ทำการเปลี่ยนแปลงเพิ่มและยืนยัน ตั้งค่า git daemon (ทำงานภายใต้ Cygwin บน WinXP) และโคลนที่เก็บหนึ่งครั้ง ตอนนี้ฉันได้รับข้อผิดพลาดนี้ด้วยที่เก็บโคลน:

$ git status
error: bad index file sha1 signature
fatal: index file corrupt

มีวิธีใดที่จะแก้ไขปัญหานี้นอกเหนือจากการรับสำเนาใหม่ของที่เก็บ?


สิ่งนี้อยู่ในที่เก็บโคลนหรือในที่เก็บต้นฉบับหรือไม่ คำสั่ง clone แสดงข้อผิดพลาดหรือไม่?
CB Bailey

คำตอบ:


1256

หากปัญหาเกิดขึ้นกับดัชนีเป็นพื้นที่จัดเตรียมสำหรับการกระทำ (เช่น.git/index) คุณสามารถลบดัชนี (สร้างสำเนาสำรองได้หากต้องการ) จากนั้นเรียกคืนดัชนีเป็นเวอร์ชันในการคอมมิทล่าสุด:

บน OSX / Linux:

rm -f .git/index
git reset

บน Windows:

del .git\index
git reset

( resetคำสั่งด้านบนเหมือนกับ git reset --mixed HEAD)

หรือคุณสามารถใช้ระดับที่ต่ำกว่าประปา แทนgit read-treegit reset


หากมีปัญหากับดัชนีpackfilegit index-packคุณสามารถกู้คืนได้โดยใช้


27
ฉันบังเอิญทำ:w!a :Gstatus(จาก fugitive.vim) คำตอบนี้ช่วยฉันดึงผมได้มาก
Laurence Gonsalves

5
ฉันรู้ว่าเราไม่ชอบข้อความ "ฉันด้วย" - แต่ "ฉันก็เหมือนกัน" สิ่งที่เท่าเทียมกันใน Windows ก็คือerase /s .git\indexฉันต้องการerase .git\index.lockเช่นกัน
Jeremy McGee

1
สวัสดีฉันมีปัญหาเดียวกันกับการค้นหาและแทนที่ แต่การรีเซ็ต git บอกฉันว่ามีไฟล์แพ็คสองไฟล์ใน. git / objects / pack / ที่ไม่สามารถเข้าถึงได้ คุณมีความคิดหรือไม่?
epsilones

13
จะปลอดภัยกว่าgit reset --keepหรือไม่ที่จะใช้แทน ในแผ่นชีท Tower Gitมีคำอธิบายดังนี้: รีเซ็ตตัวชี้ HEAD ของคุณเป็นคอมมิชชันก่อนหน้าและรักษาการเปลี่ยนแปลงในพื้นที่โดยไม่ผูกมัด
Pjetr

10
มันไม่ได้มีอยู่เมื่อฉันเขียนคำตอบนี้ ... git reset --keepรูปแบบที่ปลอดภัยกว่าของgit reset --hard; git reset --mixedไม่ได้แตะ workdir เลย
Jakub Narębski

76

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

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr "$SEARCHPATERN" "$PROJECTROOT")

เพื่อหลีกเลี่ยงปัญหานี้ในอนาคตเพียงแค่ละเว้นไฟล์ไบนารีด้วย grep / sed ของคุณ:

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr --binary-files=without-match "$SEARCHPATERN" "$PROJECTROOT")

6
หากคุณไม่สนใจที่จะสูญเสียการเปลี่ยนแปลง.git/indexคุณสามารถลบและสร้างใหม่ได้git reset(โดยไม่ต้อง--hard!)
Jakub Narębski

1
ฉันทำลายมันด้วย # find ./ -type f -exec sed -i 's / นักการเมือง / Legislator / g' {} \; การทำสิ่งที่คำตอบนี้แนะนำจะไม่ทำให้เสียในตอนแรก แต่คำตอบที่ยอมรับจะซ่อมแซมความเสียหายที่ฉันทำ นี่เป็นการป้องกันที่ยอดเยี่ยม
Ryan Mortensen

1
@RyanMortensen คุณสามารถลองย้อนกลับsedด้วยบางสิ่งเช่นfind .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; นี้อาจช่วยคุณได้หาก.git/เกิดความเสียหายซึ่งgit resetจะไม่ทำงาน หรือบางทีคุณต้องการที่จะกู้คืนที่มีอยู่ของคุณ.git/indexโดยไม่ต้องลบมัน สิ่งนี้จะล้มเหลวแน่นอนหากรหัสหรือดัชนีเดิมของคุณมี "ผู้บัญญัติกฎหมาย" อยู่แล้ว
เตาแก๊ส

1
ขอบคุณ @ ฮอบส์ที่ช่วยให้ฉันมีปัญหามากมาย - ฉันแก้ไขมันด้วยการแปลงกลับsedโดยแทนที่ฉันnew_stringด้วยold_string!
tsveti_iko

1
ฉัน refactored โครงการทั้งหมดของฉันแทนโฟลเดอร์ 'src' ใน IntelliJ และมีปัญหานี้ นี่อธิบายว่าทำไมฉันมีข้อผิดพลาดแปลก ๆ เช่นนี้!
Michael

18

ฉันมีปัญหานั้นและฉันลองแก้ไขด้วย:

rm -f .git/index
git reset

แต่มันไม่ทำงาน วิธีแก้ปัญหา ? ด้วยเหตุผลบางอย่างฉันมีโฟลเดอร์. git อื่น ๆ อยู่ในไดเรกทอรีย่อย ฉันลบโฟลเดอร์. git เหล่านั้น (ไม่ใช่ตัวการ) และgit resetอีกครั้ง เมื่อลบแล้วทุกอย่างจะทำงานอีกครั้ง


15

ฟังดูเหมือนโคลนที่ไม่ดี คุณสามารถลองทำสิ่งต่อไปนี้เพื่อรับข้อมูลเพิ่มเติม (อาจเป็นไปได้):

git fsck --full

8

เนื่องจากวิธีการแก้ปัญหาข้างต้นทำให้ฉันมีปัญหาอย่างต่อเนื่องฉันจึงใช้วิธีแก้ปัญหาที่น่าเบื่อนี้:

  1. คัดลอกสำเนาของ repo ที่อื่น
  2. คัดลอกไดเรกทอรีสด. git ไปสู่ ​​repo (ที่เสียหาย) ที่มีการเปลี่ยนแปลงที่ฉันต้องการจะส่ง

ทำเคล็ดลับ Btw ฉันทำsedตามรูตโปรเจ็กต์ @hobs เดา เรียนรู้บทเรียนของฉัน


ช่างยอดเยี่ยม :)
Jeremy Belolo

มันไม่ได้ยอดเยี่ยมจริงๆถ้าคุณอยู่ในระหว่างการรวมสร้างสาขาหรือออกคำสั่งใด ๆ ตั้งแต่การโคลนนิ่งหรือสถานการณ์อื่น ๆ ... การโคลนสำเนาของ repo ใหม่นั้นแทบจะไม่ได้แก้ปัญหาเลย มันขาดรสชาติของความอดทน (ซ้ายสุดเมื่ออยู่ในการบีบเหน็บ) จะดีกว่ามากที่จะวินิจฉัยสิ่งที่เกิดขึ้นจริงและซ่อมแซมดัชนี repo ที่มีอยู่เดิมซึ่งมักจะทำได้ง่าย บางครั้งคุณสามารถเปลี่ยนชื่อไฟล์ดัชนีได้ (หรือลบทิ้งถ้าคุณแน่ใจว่าคุณไม่ต้องการมันอีกแล้ว) และให้ Git สร้างไฟล์ใหม่ (โดยใช้ git-reset หรือ git-checkout) ..
Jazimov

7

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

rm .git/index

git reset

สิ่งนี้ใช้ได้กับฉันแม้ว่ามันจะลบไฟล์ที่เพิ่มทั้งหมดออกจากคอมไพล์ ฉันต้องเรียกใช้คอมไพล์สำหรับไฟล์เหล่านั้น
Shamsul Arefin Sajib

6

หมายเหตุสำหรับผู้ใช้ submodule git - การแก้ปัญหาที่นี่จะไม่ทำงานสำหรับคุณตามที่เป็นอยู่

สมมติว่าคุณมีพื้นที่เก็บข้อมูลหลักที่เรียกว่าdevตัวอย่างเช่นและที่เก็บ submodule ของคุณถูกเรียกว่าapiของคุณเรียกว่า

หากคุณอยู่ภายในapiและคุณได้รับข้อผิดพลาดที่กล่าวถึงในคำถามนี้:

error: bad index file sha1 signature fatal: index file corrupt

indexไฟล์จะไม่ได้รับภายในของ.gitโฟลเดอร์ ในความเป็นจริง.gitจะไม่เป็นโฟลเดอร์ - มันจะเป็นเอกสารข้อความที่มีตำแหน่งของข้อมูล. git จริงสำหรับที่เก็บนี้ มีแนวโน้มบางอย่างเช่นนี้:

~/dev/api $ cat .git gitdir: ../.git/modules/api

ดังนั้นแทนที่จะrm -f .git/indexต้องทำสิ่งนี้:

rm -f ../.git/modules/api/index git reset

หรือโดยทั่วไปแล้ว

rm -f ../.git/modules/INSERT_YOUR_REPO_NAME_HERE/index git reset


4

ปัญหานี้อาจเกิดขึ้นเมื่อมี.gitไดเรกทอรีภายใต้หนึ่งในไดเรกทอรีย่อย หากต้องการแก้ไขให้ตรวจสอบว่ามีไดเรกทอรี. git อื่นอยู่หรือไม่แล้วลบออกแล้วลองอีกครั้ง


คำตอบอื่น ๆ อีกมากมายได้ให้ข้อมูลนี้แล้ว
Simon Forsberg

-1

ฉันทำเคล็ดลับง่าย ๆ ฉันลอกแบบ repo ไปยังโฟลเดอร์ใหม่ คัดลอกโฟลเดอร์. git จากโฟลเดอร์ใหม่ไปยังโฟลเดอร์เก่าของ repo แทนที่. git ที่นั่น


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

ไม่แน่ใจเกี่ยวกับความมุ่งมั่นที่ไม่ได้เผยแพร่เพราะฉันเชื่อว่ามันถูกเก็บไว้ในโฟลเดอร์. git และฉันคัดลอกโฟลเดอร์. git ฉันไม่ได้สูญเสียสิ่งใดด้วยวิธีนี้ ฉันไม่รู้เกี่ยวกับการหยุดชะงักและการอ้างอิงเพื่อให้ความคิดเห็นใด ๆ
Astra Uvarova - ดาวเสาร์

คุณถูกต้อง แต่บางทีคุณควรเน้นว่าคุณทำโคลนนิ่งท้องถิ่น แต่ความคิดเห็นของฉันยังคงเป็นจริงสำหรับการหยุดและการอ้างอิง
Koraktor

โอเคฉันไม่มีประสบการณ์ใด ๆ เกี่ยวกับความคิดเห็นนั้นอีกต่อไปอย่างไรก็ตามมันใช้งานได้สำหรับฉันและผู้ใช้บางคนอาจพบว่ามีประโยชน์ ไม่จำเป็นต้องลงคะแนนเลย
Astra Uvarova - ดาวของดาวเสาร์


-7

นี่เป็นเรื่องไร้สาระ แต่ฉันเพิ่งรีบูตเครื่อง (mac) และปัญหาก็หายไปเหมือนไม่เคยเกิดขึ้น ฉันเกลียดที่จะฟังเหมือนเป็นคนสนับสนุน ...


-9

นอกจากนี้คุณยังสามารถลองเรียกคืนไฟล์เวอร์ชันก่อนหน้า (ถ้าคุณใช้ windows os)


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