індексний файл, менший за очікуваний


81

Сьогодні вранці я почав отримувати цю помилку від git:

фатальний: файл індексу менший, ніж очікувалося

смертельний: git status - porcelain failed

Будь-яке уявлення про те, що відбувається і як це вирішити?


Ви пробували цей vertis.github.com/2012/01/24/…
Гал Брача

Так, я спробував це перед публікацією. Проблема полягала в моїх підмодулях, які постійно псували мій індексний файл (не знаю, чому).
karellm

@karellm Ви дізналися, чому це відбувалося?
crmpicco

Ні, чесно кажучи, я не досліджував, що це спричинило, і це теж перестало траплятися.
karellm

Порада. З мого досвіду, це може бути пов’язано з тим, що папка NFS не оновлюється. Якщо ваше репо працює на NFS, просто почекайте кілька хвилин, перш ніж намагатися виправити проблему. У мене це було після витягування з однієї машини, а потім перевірки стану на іншій, обидві машини встановлюють один і той же NFS.
ggll,

Відповіді:


107

Файл індексу пошкоджений, але його можна легко повторно створити. Просто видаліть його ...

rm .git/index

Потім ви можете повторно додати файли, які намагаєтесь індексувати.


Як було сказано вище, він не працював через конфлікт із підмодулем, який раз за разом псував мій індекс ... Я видалив підмодуль, видалив індекс і додав усі. Це нарешті спрацювало. Дякую!
karellm

3
Чому так трапляється? У мене це траплялося двічі за останні два тижні, і я не бачу причини цього.
crmpicco

7
У мене це не спрацювало. До цієї помилки я мав переважно чисту робочу копію. Після видалення файлу індексу та запуску git add .він поводився так, ніби кожен окремий файл був новим і потребував коміту.
Марк

1
Також не працює, коли є підмодуль. Просто скиньте (відповідь нижче).
TimZaman

Якщо виявили, що після запуску цього мені довелося зробити a, git restore --stagedі це
усунуло

90

Якщо ви хочете зберегти локальні зміни, використовуйте наступне:

$ rm .git/index
$ git reset HEAD .

> Unstaged changes after reset:
  modified foo.txt
  modified bar.txt

1
Будь-яка ідея, чому це відбувається? Це траплялося зі мною приблизно 4-5 разів за останні два тижні.
crmpicco

1
Ця відповідь є найкращою тут. Крім того, зверніть увагу, якщо ви використовуєте підмодулі git: Видаліть також ці файли індексу (вони знаходяться в .git/modules/src). Це змусило мене здивуватися, чому помилка все-таки сталася після видалення (основного) файлу індексу.
Графтак

Я гадаю, це могло статися із стандартних причин, процес загинув посередині, закінчився дисковий простір і т. Д. Хоча в моєму випадку може бути так, що я використовую символічне посилання на папку git для створення каталогів, які використовуватимуться для побудови замість зовнішніх даних svn , хоча це дивно, оскільки єдина операція на цих репозиторіях читається лише для жорсткого скидання папок збірки.
jgmjgm

2

Для тих, хто має проблеми навіть після видалення індексу і не може зробити скидання. Якщо ви хочете зберегти свої зміни, зробіть наступне (не рішення, а скоріше некрасиве обхідне рішення!).

  1. Зробіть резервну копію своїх файлів, що, про що я збираюся сказати, має спрацювати, але робіть це про всяк випадок.
  2. Видаліть папку .git
  3. Клонуйте своє сховище (не має значення де). Я зробив це у поточному каталозі
  4. Скопіюйте створене з каталогу clone .git у ваш поточний каталог
  5. Видаліть клонований каталог 6. Необов’язково, якщо ви знову використовували для нього перевірку гілок
  6. Тепер статус Git повинен відстежувати зміни, як це передбачається, і всі ваші команди git повинні працювати

Мій випадок був описаний вище, git переплутав свої посилання ... Git logпоказував "ваша гілка здається зламаною" і git fsckдавав мені попередження про погані посилання. Придумав, чи можу я, мабуть, це виправити, але я витратив би на це багато часу, тому я пішов на некрасиве обхідне рішення.

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