Git का उपयोग करते समय "त्रुटि: खराब इंडेक्स - घातक: इंडेक्स फाइल भ्रष्ट" कैसे हल करें


611

बाद में git init, मैंने कुछ फ़ाइलों को जोड़ा और प्रतिबद्ध किया, कुछ बदलाव किए, जोड़े और प्रतिबद्ध किए। गिट डेमन (WinXP पर साइगविन के तहत चल रहा है) को सेट करें और एक बार रिपॉजिटरी पर क्लोन किया। अब, मुझे क्लोन रिपॉजिटरी के साथ यह त्रुटि मिलती है:

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

क्या इसे ठीक करने का कोई तरीका है, रिपॉजिटरी की नई कॉपी पाने के अलावा?


यह क्लोन रिपोजिटरी में है, या मूल रिपॉजिटरी में? क्या क्लोन कमांड ने कोई त्रुटि उत्पन्न की?
सीबी बेली

जवाबों:


1254

यदि समस्या इंडेक्स के लिए स्टेजिंग क्षेत्र के रूप में है (तो .git/index), तो आप केवल इंडेक्स निकाल सकते हैं (यदि आप चाहते हैं तो बैकअप कॉपी बनाएं), और फिर इंडेक्स को आखिरी कमिट में संस्करण में पुनर्स्थापित करें:

OSX / Linux पर:

rm -f .git/index
git reset

विंडोज पर:

del .git\index
git reset

( resetऊपर दिया गया आदेश समान है git reset --mixed HEAD)

आप वैकल्पिक रूप से इसके बजाय निचले स्तर की पाइपलाइन का उपयोग कर सकते git read-treeहैं git reset


यदि समस्या पैक्सफ़ाइल के लिए अनुक्रमणिका के साथ है , तो आप इसका उपयोग करके पुनर्प्राप्त कर सकते हैं git index-pack


27
मैंने गलती से :w!एक :Gstatus(भगोड़े से) में किया था। इस जवाब ने मुझे बहुत सारे बालों को खींचने से बचाया।
लारेंस गोंसाल्वेस

5
मुझे पता है कि हमें "मुझे भी" संदेश पसंद नहीं है - लेकिन "मुझे भी"। विंडोज में समतुल्य है erase /s .git\index, मुझे erase .git\index.lockभी इसकी आवश्यकता है।
जेरेमी मैक्गी

1
नमस्ते, मुझे ढूंढने और बदलने में समान समस्या थी, लेकिन git रीसेट बताता है कि .गित / ऑब्जेक्ट्स / पैक / में दो पैक फाइलें हैं जिन्हें एक्सेस नहीं किया जा सकता है। क्या आपके पास कोई विचार है ?
एप्सिलोन्स

13
git reset --keepइसके बजाय इसका उपयोग करना सुरक्षित नहीं होगा ? में टॉवर Git चीट शीट के रूप में समझाया गया है: पिछले एक करने के लिए अपने सिर सूचक रीसेट करने और बनाए रखने के अप्रतिबद्ध स्थानीय परिवर्तन
Pjetr

10
जब मैं यह जवाब लिख रहा था तो यह मौजूद नहीं था ... वैसे भी git reset --keepसुरक्षित रूप है git reset --hard; git reset --mixedकार्यदिवस को बिल्कुल भी नहीं छूता है।
जैकब नर

76

आपने गलती से .it / 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!)
जैकब नार 12:बस्की

1
मैंने इसे # खोज के साथ तोड़ दिया। यह जवाब देने की सिफारिश करने से यह पहली जगह में नहीं टूटा होगा, लेकिन स्वीकृत उत्तर ने उस नुकसान की मरम्मत की जो मैंने किया था। यह हालांकि उत्कृष्ट रोकथाम है।
रयान मोर्टेनसेन

1
@RyanMortensen आप अपने sedसाथ कुछ ऐसा करने की कोशिश कर find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; सकते हैं जैसे कि अगर आपका काम .git/इतना दूषित है तो git resetयह काम नहीं करेगा। या हो सकता है कि आप .git/indexइसे हटाए बिना अपने मौजूदा को पुनर्स्थापित करना चाहते हैं । यह निश्चित रूप से विफल होगा, अगर आपके मूल कोड या इंडेक्स में पहले से ही कुछ "विधायक" थे।
हॉब्स

1
धन्यवाद @hobs तुम मुझे मुसीबत का एक बहुत कुछ बचा लिया - मैं inverting द्वारा इसे हल sedमेरी जगह से new_stringमेरी साथ old_string!
tsveti_iko

1
मैंने IntelliJ में 'src' फोल्डर के बजाय अपना पूरा प्रोजेक्ट रिफ़लेक्ट किया और यह समस्या थी। यह बताता है कि मेरे पास ऐसी अजीब त्रुटियां क्यों थीं!
माइकल

18

मुझे वह समस्या थी, और मैं इस के साथ ठीक करने की कोशिश करता हूं:

rm -f .git/index
git reset

लेकिन यह काम नहीं करता। समाधान ? किसी कारण से मेरे पास उप निर्देशिकाओं में। अन्य फ़ोल्डर थे। मैं उन .गित फ़ोल्डर (प्रिंसिपल नहीं) को हटा देता हूं और git resetफिर से। एक बार जब वे हटा दिए गए, तो सब कुछ फिर से काम कर गया।


15

यह एक खराब क्लोन की तरह लगता है। आप अधिक जानकारी प्राप्त करने के लिए निम्नलिखित प्रयास कर सकते हैं (संभवतः?):

git fsck --full

8

चूँकि उपरोक्त समाधानों ने मुझे लगातार समस्याओं के साथ छोड़ दिया, इसलिए मैंने इस सुस्त समाधान का उपयोग किया:

  1. रेपो की एक नई प्रति कहीं और क्लोन करें
  2. ताजा (। टूटी हुई) रेपो निर्देशिका में कॉपी करें जिसमें वे बदलाव थे जो मैं करना चाहता था

की चाल चली। Btw, मैंने sedप्रोजेक्ट रूट पर किया था जैसा कि @hobs ने अनुमान लगाया था। मेरा पाठ सीखा।


यह शानदार है :)
जेरेमी बेलोलो

यह वास्तव में शानदार नहीं है यदि आप एक मर्ज के बीच में थे, शाखाओं का निर्माण किया था या क्लोनिंग के बाद से कोई कमिट जारी किया था, या कई अन्य परिदृश्यों में से कोई भी ... रेपो की एक नई प्रति का क्लोनिंग शायद ही कोई समाधान हो और मैं हिम्मत करूँ यह अधीरता की गंध देता है (सबसे अच्छा जब एक सच्ची चुटकी में छोड़ दिया जाता है)। यह वास्तव में निदान करने के लिए बेहतर है कि क्या चल रहा है और मौजूदा रेपो के सूचकांक की मरम्मत करें - यह आमतौर पर अपेक्षाकृत आसान है। कभी-कभी आप बस अनुक्रमणिका फ़ाइल का नाम बदल सकते हैं (या इसे हटा सकते हैं, यदि आप सुनिश्चित हैं कि आपको कभी भी फिर से इसकी आवश्यकता नहीं होगी) और Git को एक नया बनाएं (git-reset या git-checkout का उपयोग करके) ..
Jazimov

7

इसने मेरे लिए काम किया। हालाँकि मुझे इस बात की उत्सुकता है कि मुझे पहली बार में ही त्रुटियाँ मिलने लगी थीं। जब मैंने कल लॉग आउट किया, तो यह ठीक था। इस सुबह में प्रवेश करें, यह नहीं था।

rm .git/index

git reset

इसने मेरे लिए काम किया, हालाँकि इसने सभी जोड़ फ़ाइलों को गिट से हटा दिया। मुझे उन फाइलों के लिए गिट ऐड चलाना था
शम्सुल आरफिन साजिब

6

Git सबमॉड्यूल यूज़र्स के लिए ध्यान दें - यहाँ समाधान आपके लिए काम नहीं करेगा जैसा कि है।

मान लीजिए कि आपके पास एक माता-पिता का भंडार है dev, उदाहरण के लिए, और आपका उप-संग्रह भंडार कहा जाता है 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उपनिर्देशिका के नीचे कोई निर्देशिका है। इसे ठीक करने के लिए, जाँच करें कि क्या वहाँ अन्य। निर्देशिका हैं, और उन्हें हटा दें और पुनः प्रयास करें।


कई अन्य उत्तर पहले ही यह जानकारी दे चुके हैं।
साइमन फोर्सबर्ग

-1

मैंने एक साधारण टोटका किया। मैं रेपो को एक नए फ़ोल्डर में क्लोन करता हूं। नए फोल्डर से .git फोल्डर को रेपो के पुराने फोल्डर में कॉपी किया गया है, जिसे .git को बदल दिया गया है।


बहुत खतरनाक है क्योंकि यह अप्रकाशित आवागमन, टैग और शाखाओं के साथ-साथ स्टैग और रिफ्लॉग जैसे डेटा को हटा देगा।
कोराक्टर

अप्रकाशित कमिट के बारे में निश्चित नहीं है क्योंकि मेरा मानना ​​है कि वे .it फ़ोल्डर में संग्रहीत हैं और मैंने .git फ़ोल्डर की प्रतिलिपि बनाई है। मैंने इस पद्धति से कुछ भी नहीं खोया। मुझे इस बारे में कोई टिप्पणी करने के लिए स्टैब्लिश और रिफ्लॉग के बारे में पता नहीं है।
एस्ट्रा उवरोवा - शनि का तारा

आप सही हैं, लेकिन शायद आपको इस बात पर जोर देना चाहिए कि आपने एक स्थानीय क्लोन किया है। लेकिन मेरी टिप्पणी अभी भी stashes और reflog के लिए सही है।
कोरकटोर

ठीक है, मेरे पास उस टिप्पणी पर कुछ भी अनुभव नहीं है, हालांकि, यह मेरे लिए काम करता है और कुछ उपयोगकर्ता इसे उपयोगी पा सकते हैं। इसे नीचा दिखाने की कोई जरूरत नहीं है।
एस्ट्रा उवरोवा - शनि का तारा


-7

यह हास्यास्पद है लेकिन मैंने अभी-अभी अपनी मशीन (मैक) को रिबूट किया है और यह समस्या दूर हो गई है जैसा कि कभी नहीं हुआ। मैं एक समर्थन आदमी की तरह ध्वनि से नफरत है ...


-9

आप फ़ाइल के पिछले संस्करण को पुनर्स्थापित करने के लिए भी प्रयास कर सकते हैं (यदि आप विंडोज़ ओएस का उपयोग कर रहे हैं)


1
जवाब मत देना तुम नहीं जानते।
अल्ताफ पटेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.