Як вирішити "Помилка: поганий індекс - Fatal: файл індексу пошкоджений" під час використання Git


611

Після цього git initя додав і зробив декілька файлів, вніс деякі зміни, додав і вчинив. Встановіть демон git (працює під Cygwin на WinXP) і один раз клонували сховище. Тепер я отримую цю помилку із клонованим сховищем:

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

Чи є якийсь спосіб це виправити, окрім отримання нової копії сховища?


Це в клонованому сховищі чи в оригінальному сховищі? Команда клонування видала помилки?
CB Bailey

Відповіді:


1255

Якщо проблема пов’язана з індексом як зоною постановки для комітетів (тобто .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


Якщо проблема з індексом пакету файлів , ви можете відновити його за допомогою git index-pack.


27
Я випадково зробив а :w!в :Gstatus(від втікача.вім). Ця відповідь врятувала мені багато волосся.
Лоранс Гонсалвс

5
Я знаю, що нам не подобаються повідомлення "я теж", але "я теж". Еквівалент в Windows erase /s .git\index, мені erase .git\index.lockтеж потрібно .
Джеремі Макгі

1
Привіт, у мене була та сама проблема з пошуку та заміною, але скидання git повідомляє мені, що у .git / object / pack /, які неможливо отримати доступ, є два файли пакету. У вас є ідея?
epsilones

13
хіба це не було б безпечніше використовувати git reset --keepнатомість? У Cheat Sheet Tower Git це пояснюється як: Скиньте вказівник HEAD на попередній
фіксатор та збережіть непомітні

10
Цього не було, коли я писав цю відповідь ... Так git reset --keepчи інакше, це безпечніша форма git reset --hard; git reset --mixedвзагалі не торкається workdir.
Якуб Нарубський

76

Можливо, ви випадково пошкодили файл .git / index з sed на корені проекту (можливо, рефакторинг?) Чимось на зразок:

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!).
Якуб Нарубський

1
Я порушив це з # find ./ -type f -exec sed -i 's / Політик / Законодавець / g' {} \; Виконання того, що рекомендує ця відповідь, це в першу чергу не порушило б її, але прийнята відповідь відшкодувала шкоду, яку я завдав. Хоча це відмінна профілактика.
Райан Мортенсен

1
@RyanMortensen Ви можете спробувати перевернути sedщось подібним. find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; Це може допомогти, якщо ваш .git/настільки пошкоджений, що git resetне буде працювати. Або, можливо, ви хочете відновити своє існуюче, .git/indexне видаляючи його. Це, звичайно, не вдасться, якщо ваш оригінальний код або індекс вже містили в ньому деякий "Законодавець".
варильні панелі

1
Дякую @hobs, що ти врятував мені багато клопоту - я вирішив це шляхом перевернення sed, замінивши new_stringмоє old_string!
tsveti_iko

1
Я відремонтував весь свій проект замість папки 'src' в IntelliJ, і у мене була ця проблема. Це пояснює, чому я мав такі дивні помилки!
Майкл

18

У мене була ця проблема, і я намагаюся виправити це:

rm -f .git/index
git reset

АЛЕ це не вийшло. Рішення ? Чомусь у мене були інші .git папки в підкаталогах. Я видаляю ці .git папки (не головні) і git resetзнову. Як тільки їх видалили, все працювало знову.


15

Це звучить як поганий клон. Ви можете спробувати наступне, щоб отримати (можливо?) Більше інформації:

git fsck --full

8

Оскільки вищезазначені рішення залишили у мене постійні проблеми, я використав це тьмяне рішення:

  1. клонувати нову копію репо в інших місцях
  2. скопіюйте каталог свіжих файлів .git в (зламане) репо, яке містило зміни, які я хотів зробити

Зробив трюк. До речі, я зробив sedкорінь проекту, як @hobs здогадався. Вивчила мій урок.


Це геніально :)
Джеремі Белоло

Це не дуже геніально, якщо ви опинилися в центрі злиття, створили відділення або видали будь-які комісії після клонування або будь-який з ряду інших сценаріїв ... Клонування нової копії репо навряд чи є рішенням, і я смію сказати це присмакує нетерплячість (найкраще залишити, коли в справжній щіпці). Набагато краще насправді діагностувати, що відбувається, і ремонтувати існуючий індекс репо, що зазвичай зробити досить просто. Іноді ви можете просто перейменувати індексний файл (або видалити його, якщо ви впевнені, що вам ніколи більше не знадобиться) і дозволити Git створити новий (за допомогою git-reset або git-checkout) ..
Язимов

7

Це працювало для мене. Хоча мені цікаво, чому я почав отримувати помилки в першу чергу. Коли я вчора вийшов, це було добре. Увійдіть сьогодні вранці, не було.

rm .git/index

git reset

Це працювало для мене, хоча він видалив усі додані файли з git. Мені довелося запустити git add для цих файлів
Шамсул Арефін Саджиб

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під одним із підкаталогів є каталог. Щоб виправити це, перевірте, чи є там інші .git каталоги, і видаліть їх та спробуйте ще раз.


Кілька інших відповідей уже дали цю інформацію.
Саймон Форсберг

-1

Я зробив просту хитрість. Я клоную репо в нову папку. Скопіював папку .git з нової папки в стару папку repo, замінивши там .git.


Дуже небезпечно, оскільки вона буде видаляти такі дані, як неопубліковані коміти, теги та гілки, а також сташі та рефлоги.
Корактор

Не впевнений у неопублікованих комісіях, оскільки я вважаю, що вони зберігаються у папці .git і я скопіював папку .git. Я цим методом нічого не втратив. Я не знаю про приховування та відмову, щоб коментувати це.
Астра Уварова - зірка Сатурна

Ви маєте рацію, але, можливо, варто підкреслити, що ви зробили місцевий клон. Але мій коментар все-таки справедливий для приховування та переробки
Корактор

Гаразд, я не маю жодного досвіду щодо цього коментаря, але це працювало для мене, і деякі користувачі можуть вважати його корисним. Немає потреби вступати в силу.
Астра Уварова - зірка Сатурна


-7

Це смішно, але я просто перезавантажив свою машину (mac), і проблема пішла так, як ніколи не бувало. Я ненавиджу звучати як хлопець із підтримки ...


-9

Ви також можете спробувати відновити попередню версію файлу (якщо ви використовуєте Windows OS)


1
Не ставте відповіді, якого не знаєте.
Альтаф Патель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.