Отримати фатальну помилку в git для записів на кілька етапів


241

Використовуючи Git версії 2.2.0 з ігровим механізмом єдності на 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
так чому це відбувається?
Чарлі Паркер

просто зробіть манекен редагувати згаданий файл і "зробити і синхронізувати".
sajanyamaha

Примітка: дивіться також 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, яка вирішила провалити мене, і інша комп’ютерна помилка поставила мене позаду в моїх проектах.


@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?

"Індекс" git - це місце, де ви розміщуєте файли, які ви хочете присвятити сховищу git.

Перед тим, як "зафіксувати" (checkin) файли до сховища git, потрібно спочатку розмістити файли в git "index".

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

Редагувати: Схоже, це пов'язано з Mac (на основі коментарів), тому, якщо це допоможе, я перебуваю на OSX 10.10 та git версії 2.3.4, встановленої через пиво


1
Так, це спрацювало і дякую за пояснення. Один застереження, перш ніж зробити це, - це зберігати або переміщувати чи видаляти файли, до яких ви не додали поточний список змін за замовчуванням. Вони повернуться зgit add -A
Кірбі

4
Підтвердьте це на Mac OS X Yosemite. Сталося під час роботи в Android Studio, хоча конкретного відтворюваного сценарію не було.
Дрю,

4
Це має бути правильна відповідь, оскільки це працює, і це має кращі пояснення. Це так само трапилось і зі мною.
Джаред Берроуз

1
Працював і для мене. Додавання кореневого контролю версії в IntelliJ захистило його, але rm'ing індекс git працював нормально. Дякуємо за пояснення @grant.
Ендрю Ееллс

1
У мене також була ця проблема, коли IntelliJ працював у фоновому режимі, коли я робив деякі зміни з vim. Я думаю, що там була гонка git. (Насправді, я думаю, їх дуже багато.) Закриття IntelliJ, видалення індексу та повторне виконання моєї роботи працювали чудово.
Роберт Фішер

119

Для проекту

rm .git/index
git reset

після видалення індексу потрібно відтворити його шляхом скидання git

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

Перейдіть до основної папки проекту

rm .git/modules/your_project_structure/index
git reset --hard HEAD

4
Скидання git після видалення індексу повністю прибило його. Дякую! Якщо ви не скинете кожен файл, індекс буде новим, тому його потрібно додати. Скидання індексу відновить здається. Хоча я не розумію, як git може відновити індекс без індексу?
JosFabre

1
@JosFaber Тому, що індекс не вводить історію. Насправді це "зайва" хелперна структура. Див. Schacon.github.io/gitbook/7_the_git_index.html Таким чином, можна повністю відновити, порівнюючи робоче дерево та HEAD. І саме це робить скидання git. Сторінка людини говорить: ... скинути записи копій з <tree-ish> до індексу ...
farincz

2
Дякую! Без скидання git, мені хотілося повторно додати всі файли, які вже є у сховищі.
Роберт Бернштейн

1
Я використовую sourcetree на своєму mac. Я вручну видалив .git / index, потім вибрав останню хорошу фіксацію, клацнув правою кнопкою миші, вибрав майстер скидання (у моєму випадку) до цього коментаря - потім вибрав змішаний варіант, який залишає мою роботу в хорошому стані. Тоді я зміг зробити зобов’язання своєї теперішньої роботи і зараз все здорово.
користувач216661

1
Найчистіший і найшвидший спосіб!
h4rd4r7c0r3

29

Ви можете видалити файл індексу Git зі свого проекту. У корені проекту виконайте таку команду:

rm .git/index

Після цього git це працює.


3
Це не відповідає на запитання. Будь ласка, деталізуйте цю відповідь більш детально.
ArtOfCode

Не працював для мене rm: /.git/index: No such file or directoryMac OSX Yosemite; git 2.3.4, встановлений через домашню мову
надайте

@grant На початку потрібно зняти косу рису. ( rm .git/indexу вашому каталозі git).
ChristophLSA

2
@ChristophLSA дякую - я відповів описом того, що ця дія робить для забезпечення ясності. Чи можна оновити цю відповідь так, щоб відображати правильний шлях та інформувати користувачів про те, що робить дія?
грант

1
Я знаю, чому це працює. Проблема викликана пошкодженим індексом. Я зіткнувся з цією проблемою, коли пошкодив індекс, змінивши код в IntelliJ під час написання повідомлення про фіксацію в командному рядку. Видалення індексу не знищує ваші зміни, воно просто знеструмлює їх.
Піролістичний

3

Я пробую інше рішення, і це працює на мене. Нижче наведені мої варіанти

#cd .git
#rm index
#cd ..
#git add .

як сказав @farincz, вам потрібно знову відтворити індекс, зателефонувавши в git resetіншому випадку, який він дає вам fatal: Could not reset index file to revision 'HEAD' .
кускмен

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 (OSX). Все, що я зробив - це запустити додаток і знову відкрити роботу, а потім воно почало працювати.

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