Получение фатальной ошибки в git для многоступенчатых записей

241

Я использовал Git версии 2.2.0 с игровым движком Unity на OS X и хотел зафиксировать мой код. Я добавил все и не получил сообщение об ошибке. затем подтвердите -m и получите это сообщение об ошибке:

fatal: multiple stage entries for merged file 'Assets/Prefabs/Resources'

Не заметив этого, я нажал, что это не Everything up-to-date выдает сообщение об ошибке, фактически сказал, поэтому я проверил битбакет (где находится репо), и он не показал мой коммит. поэтому я проверил свой локальный журнал, и это также не показывает мой коммит.

Я посмотрел в Google для ответа ... и ничего. что это за ошибка? и как я могу это исправить?

Дэниел Тобе
источник
Какую версию Git или инструмент вы используете? Недавно в списке разработчиков появилась ветка об улучшении проверки многоступенчатых записей. news.gmane.org/gmane.comp.version-control.git
Филипп Оукли
Кажется вероятным, что возможна дополнительная проверка в 2.2.0. «Убедитесь, что необработанные записи удалены». 12 августа. Автор: Jaime Soriano Pastor.
Филипп Окли
4
так почему это происходит?
Чарли Паркер
просто сделайте фиктивное редактирование указанного файла и выполните «commit and sync».
Саджаньямаха
Примечание: см. Также stackoverflow.com/a/51919644/6309
VonC

Ответы:

381

Первый обходной путь, который , кажется, работает с последними версиями Git (2.3+, Q2 + 2015) упоминается в гранту «s более уточненный ответ :

  1. Удалить индекс

    $ rm .git/index
    
  2. Добавить все

    $ git add -A
    
  3. совершить

    $ git commit -a
    

Оригинальный ответ (конец 2014 г.)
Обычный обходной путь:

  • снова клонировать удаленное репо в новое локальное репо
  • добавьте изменения из первого репо во второй:

    $ cd /patH/to/second/cloned/repo
    $ git --work-tree=/path/to/first/repo add .
    

Вы можете увидеть это сообщение об ошибке read-cache.c, которое обсуждается в этом патче (« read-cache.c: убедитесь, что неотправленные записи удалены ») и введено в коммит Git 2.2 .
Поскольку это так недавно, вполне возможно, что понижения Git до 2.1 будет достаточно, чтобы не повредить этот патч.

OP Daniel Toebe добавляет в комментариях :

Проблема произошла на моем MacBook, который решил потерпеть неудачу на мне, и другой сбой компьютера поставил меня далеко позади в моих проектах.

VonC
источник
@sharpner, возможно, это ошибка или побочный эффект этого патча в вашем случае.
VonC
1
Извините за задержку с ответом ... Проблема произошла в моем macbook, который решил не работать со мной, и еще один сбой компьютера поставил меня далеко позади в моих проектах.
Даниэль Тобе
1
@DanielToebe хорошие отзывы. Я включил его в ответ для большей наглядности.
VonC
Я просто столкнулся с тем же, после попыткиgit commit -c sha
Крис Лейшман
2
Для всех заинтересованных, это случилось со мной, потому что я случайно редактировал файл в моей папке .git вместо самого файла.
ostler.c
166

Я считаю, что столкнулся с этой проблемой, потому что я добавил и зафиксировал изменения, а затем удалил файл, который я только что зафиксировал. Если это похоже на ваш случай, я рекомендую следовать приведенным ниже инструкциям, чтобы сохранить повторное клонирование и ручное добавление изменений.

Я смог решить эту проблему, удалив файл .git / index в моем хранилище, аналогично тому, что предлагал @slider (я думаю, он неправильно набрал путь).

rm .git/index

Затем я должен был добавить и зафиксировать свои локальные изменения снова

git add -A
git commit -m "..."

Я тогда смог толкнуть дистанционно.

Что такое индекс git и насколько он актуален?

Что за дело с Git Index?

Индекс git - это место, куда вы помещаете файлы, которые вы хотите отправить в репозиторий git.

Прежде чем «фиксировать» (проверять) файлы в репозитории git, вам необходимо сначала поместить файлы в «индекс» git.

Я считаю, что, удалив этот файл, git переиндексирует репо, создаст новый, и все готово. Это решает эту проблему, потому что локальный репозиторий переиндексируется без файла, который я удалил, что вызвало всю суету.

Изменить: Кажется, что это связано с Mac (на основе комментариев), поэтому, если это поможет, я на OSX 10.10 и git версии 2.3.4, установленной через brew.

грант
источник
1
Да, это сработало, и спасибо за объяснение. Одно предостережение: прежде чем вы сделаете это, вы можете сохранить, переместить или удалить любые файлы, которые вы не добавили в текущий список изменений по умолчанию. Они будут втянуты обратно сgit add -A
Кирби
4
Подтвердите это на Mac OS X Yosemite. Произошло во время работы в Android Studio, хотя конкретного воспроизводимого сценария не было ..
Дрю
4
Это должен быть правильный ответ, потому что он работает, и у него есть лучшее объяснение. Это также случилось со мной.
Джаред Берроуз,
1
Работал на меня тоже. Добавление корня контроля версий в IntelliJ не помогло, но индекс git работал нормально. Спасибо за объяснение @grant.
Эндрю Эллс
1
У меня также была эта проблема, когда IntelliJ работал в фоновом режиме, пока я вносил некоторые изменения с помощью vim. Я думаю, что там было состояние гонки git. (На самом деле, я думаю, что их много.) Закрытие IntelliJ, удаление индекса и повторная фиксация моей работы работали просто отлично.
Роберт Фишер
119

Для проекта

rm .git/index
git reset

после удаления индекса вам нужно восстановить его с помощью git reset

Для подмодуля:

Перейти в основную папку проекта

rm .git/modules/your_project_structure/index
git reset --hard HEAD
farincz
источник
4
Git сброс после удаления индекса полностью прибил его. Спасибо! Если вы не сбросите настройки, каждый файл будет новым для индекса, поэтому его необходимо добавить. Сброс восстановит индекс, кажется. Даже если я не понимаю, как git может перестроить индекс без индекса?
JosFabre
1
@JosFaber Потому что индекс не является историей коммитов. На самом деле это «избыточная» вспомогательная структура. См. Schacon.github.io/gitbook/7_the_git_index.html Так что можно полностью перестроить сравнение рабочего дерева и HEAD. И это именно то, что делает git reset. Страница руководства говорит: ... сбросить копии записей из <tree-ish> в индекс ...
farincz
2
Спасибо! Без сброса git он захотел, чтобы я заново добавил все файлы, уже находящиеся в хранилище.
Роберт Бернштейн
1
Я использую Sourcetree на моем Mac. Я вручную удалил .git / index, затем выбрал последний удачный коммит, щелкнул правой кнопкой мыши, выбрал мастер сброса (в моем случае) для этого комментария - затем выбрал смешанный вариант, который оставляет мою работу в хорошем состоянии. Тогда я был в состоянии выполнить обязательство моей текущей работы, и все теперь здорово.
user216661
1
Самый чистый и быстрый способ!
h4rd4r7c0r3
29

Вы можете удалить индексный файл Git из вашего проекта. В корне вашего проекта выполните следующую команду:

rm .git/index

После этого мерзавец работает.

ползунок
источник
3
Это не отвечает на вопрос. Пожалуйста, уточните этот ответ более подробно.
ArtOfCode
У меня не работал rm: /.git/index: No such file or directoryMac OSX Yosemite; git 2.3.4 установлен через homebrew
грант
@ Grant Вы должны удалить косую черту в начале. ( rm .git/indexв вашем каталоге git).
ChristophLSA
2
@ChristophLSA спасибо - я ответил с описанием того, что это действие делает для ясности. Можно ли обновить этот ответ, чтобы он отражал правильный путь и информировал пользователей о действиях?
грант
1
Я знаю, почему это работает. Проблема вызвана поврежденным индексом. Я столкнулся с этой проблемой, когда повредил индекс, изменив код в IntelliJ во время записи сообщения коммита в командной строке. Удаление индекса не разрушает ваши изменения, он просто их не выполняет.
Пиролистический
3

Я пробую другое решение, и оно работает для меня. Ниже мои варианты

#cd .git
#rm index
#cd ..
#git add .
wqycsu
источник
как сказал @farincz, вам нужно заново создать индекс, вызвав git resetего, иначе он даст вам fatal: Could not reset index file to revision 'HEAD' .
kuskmen
1

Если это происходит в подмодуле

Индексный файл находится внутри родительского .gitкаталога:

.git/modules/your_project_structure/index

В подмодуле нет названных каталогов .git(по крайней мере, в проекте, над которым я работаю), есть только .gitфайл, который говорит вам (и git), где искать каталог git этого проекта.

Состояние Git показывает изменения, которые я не сделал

После удаления файлов индекса и выполнения операции git resetя обнаружил, что столкнулся с множеством необъяснимых изменений, и полный сброс не помог.

Предупреждение, что вы потеряете все свои изменения, поэтому передайте их и нажмите, прежде чем продолжить.

Индекс казался поврежденным, поэтому я удалил его с помощью следующих команд.

git rm -rf --cached .
git reset --hard HEAD
Эмиль Бержерон
источник
0

Я только что получил эту ошибку с Github Desktop Client (OSX). Все, что я сделал, это вышел из приложения и снова открыл, а затем он начал работать.

Орен
источник