Uzyskiwanie krytycznego błędu w git dla wpisów wieloetapowych

241

Korzystając z Gita w wersji 2.2.0 z silnikiem gry Unity na OS X, chciałem zatwierdzić mój kod. Dodałem wszystko i nie dostałem komunikatu o błędzie. następnie zatwierdź -m i otrzymałem następujący komunikat o błędzie:

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

Nie zauważając tego, nacisnąłem, który nie dał komunikatu o błędzie, w rzeczywistości powiedziałem, Everything up-to-date więc sprawdziłem bitbucket (gdzie odbywa się repo) i nie pokazałem mojego zatwierdzenia. więc sprawdziłem mój lokalny dziennik i to również nie pokazuje mojego zatwierdzenia.

Szukałem odpowiedzi w google ... i nic. co to za błąd? i jak mogę to naprawić?

Daniel Toebe
źródło
Jakiej wersji git lub narzędzia używasz? Na liście programistów pojawił się najnowszy wątek dotyczący poprawy sprawdzania wpisów wieloetapowych. news.gmane.org/gmane.comp.version-control.git
Philip Oakley
Wygląda na to, że może to wymagać dodatkowego sprawdzania w 2.2.0. „Upewnij się, że nie scalono wpisów” 12 sierpnia autor: Jaime Soriano Pastor, może być jednym wątkiem na początek.
Philip Oakley,
4
więc dlaczego tak się dzieje?
Charlie Parker,
po prostu wykonaj fikcyjną edycję wspomnianego pliku i „zatwierdzaj i synchronizuj”.
sajanyamaha
Uwaga: patrz także stackoverflow.com/a/51919644/6309
VonC

Odpowiedzi:

381

Pierwszy obejście, które wydaje się działać z ostatnich wersji Git (2.3 lub nowszym, Q2 + 2015) jest wymieniony w grantu jest bardziej up-to-date odpowiedzi :

  1. Usuń indeks

    $ rm .git/index
    
  2. Dodać wszystko

    $ git add -A
    
  3. Popełnić

    $ git commit -a
    

Oryginalna odpowiedź (koniec 2014 r.)
Zwykłym obejściem jest:

  • sklonuj ponownie repozytorium zdalne w nowe repozytorium lokalne
  • dodaj zmiany z pierwszego repo do drugiego:

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

Możesz zobaczyć ten komunikat o błędzie read-cache.c, omówiony w tej łatce („ read-cache.c: Upewnij się, że nie zostały scalone wpisy usunięte ”) i wprowadzony w zatwierdzeniu Git 2.2 .
Ponieważ jest to tak niedawne, możliwe jest, że obniżenie Gita do 2.1 wystarczyłoby, aby łatka nie miała na niego wpływu.

OP Daniel Toebe dodaje w komentarzach :

Problem pojawił się na moim MacBooku, który postanowił mnie zawieść, a kolejna wpadka komputerowa opóźniła mnie w moich projektach.

VonC
źródło
@sharpner możliwe, że w twoim przypadku jest to błąd lub efekt uboczny tej łatki.
VonC
1
Przepraszam za opóźnioną odpowiedź ... Problem pojawił się na moim MacBooku, który postanowił zawieść na mnie, a inna wpadka komputerowa opóźniła mnie w moich projektach.
Daniel Toebe,
1
@DanielToebe dobre opinie. Uwzględniłem to w odpowiedzi dla większej widoczności.
VonC
Po prostu wpadłem na to samo, po próbiegit commit -c sha
Chris Leishman
2
Dla wszystkich zainteresowanych stało się tak, ponieważ przypadkowo edytowałem plik w folderze .git zamiast samego pliku.
ostler.c
166

Wydaje mi się, że napotkałem ten problem, ponieważ dodałem i zatwierdziłem zmiany, a następnie usunąłem właśnie zatwierdzony plik. Jeśli brzmi to podobnie jak w Twoim przypadku, zalecamy wykonanie poniższych czynności, aby zapisać ponowne klonowanie i ręcznie dodać zmiany.

Byłem w stanie rozwiązać ten problem, usuwając plik .git / index z mojego repozytorium, podobnie jak sugerował @slider (myślę, że pomylił ścieżkę).

rm .git/index

Następnie musiałem ponownie dodać i zatwierdzić moje lokalne zmiany

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

Byłem wtedy w stanie naciskać zdalnie.

Co to jest indeks git i jak jest istotny?

O co chodzi z indeksem Git?

„Indeks” git to miejsce, w którym umieszczasz pliki, które chcesz zatwierdzić w repozytorium git.

Przed „zatwierdzeniem” (zameldowaniem) plików do repozytorium git, musisz najpierw umieścić pliki w „indeksie” git.

Wierzę, że po usunięciu tego pliku git ponownie zindeksuje repozytorium, utworzy nowy i jesteś gotowy. Rozwiązuje ten problem, ponieważ lokalne repozytorium jest ponownie indeksowane bez pliku, który usunąłem, co spowodowało całe zamieszanie.

Edycja: Wygląda na to, że jest to związane z komputerem Mac (na podstawie komentarzy), więc jeśli to pomaga, korzystam z OSX 10.10 i git w wersji 2.3.4 zainstalowanej przez brew.

dotacja
źródło
1
Tak, zadziałało i dziękuję za wyjaśnienie. Jednym zastrzeżeniem jest to, aby zrobić to ukryć, przenieść lub usunąć pliki, do których nie dodano bieżącej domyślnej listy zmian. Zostaną ponownie wciągnięci przezgit add -A
Kirby
4
Potwierdź to w Mac OS X Yosemite. Zdarzyło się to podczas pracy w Android Studio, choć nie było konkretnego powtarzalnego scenariusza.
Drew
4
To powinna być poprawna odpowiedź, ponieważ działa i ma lepsze wytłumaczenie. To samo mi się przydarzyło.
Jared Burrows,
1
Pracował również dla mnie. Dodanie roota kontroli wersji w IntelliJ nie powiodło się, ale sprawdzanie indeksu git działało dobrze. Dzięki za wyjaśnienie @grant.
Andrew Eells
1
Miałem również ten problem, gdy IntelliJ działał w tle, gdy dokonywałem modyfikacji w vimie. Myślę, że był wyścig git. (Właściwie wydaje mi się, że jest ich wiele.) Zamykanie IntelliJ, usuwanie indeksu i ponowne uruchamianie mojej pracy działało dobrze.
Robert Fischer
119

Dla projektu

rm .git/index
git reset

po usunięciu indeksu należy go ponownie utworzyć, wykonując polecenie git reset

Dla submodułu:

Przejdź do głównego folderu projektu

rm .git/modules/your_project_structure/index
git reset --hard HEAD
farincz
źródło
4
Reset gita po usunięciu indeksu całkowicie go przybił. Dzięki! Jeśli nie zresetujesz, każdy plik będzie nowy w indeksie, więc należy go dodać. Resetowanie odbuduje indeks, jak się wydaje. Nawet jeśli nie rozumiem, jak git może odbudować indeks bez indeksu?
JosFabre
1
@JosFaber Ponieważ indeks nie jest historią zatwierdzania. W rzeczywistości jest to „nadmiarowa” struktura pomocnika. Zobacz schacon.github.io/gitbook/7_the_git_index.html Aby można go całkowicie przebudować, porównując działające drzewo i HEAD. I właśnie to robi git reset. Strona
podręcznika
2
Dziękuję Ci! Bez resetowania git chciałem, żebym ponownie dodał wszystkie pliki znajdujące się już w repozytorium.
Robert Bernstein,
1
Używam sourcetree na moim komputerze Mac. Ręcznie usunąłem .git / index, następnie wybrałem ostatnie dobre zatwierdzenie, kliknąłem prawym przyciskiem myszy, wybrałem reset master (w moim przypadku) do tego komentarza - następnie wybrałem opcję mieszaną, która pozostawia moją pracę w dobrym stanie. Byłem wtedy w stanie wykonać zatwierdzenie mojej obecnej pracy i wszystko jest teraz zdrowe.
user216661
1
Najczystszy i najszybszy sposób!
h4rd4r7c0r3
29

Możesz usunąć plik indeksu Git ze swojego projektu. W katalogu głównym projektu uruchom następujące polecenie:

rm .git/index

Po tym git działa.

suwak
źródło
3
To nie odpowiada na pytanie. Uzupełnij tę odpowiedź, podając więcej szczegółów.
ArtOfCode
Nie działało dla mnie rm: /.git/index: No such file or directoryMac OSX Yosemite; git 2.3.4 zainstalowany przez homebrew
udziel
@grant Na początku musisz usunąć ukośnik. ( rm .git/indexw twoim katalogu git).
ChristophLSA,
2
@ChristophLSA dziękuję - odpowiedziałem z opisem tego, co robi to działanie, aby zapewnić jasność. Czy tę odpowiedź można zaktualizować, aby odzwierciedlała właściwą ścieżkę i informowała użytkowników o działaniu?
udzielenie
1
Wiem dlaczego to działa. Przyczyną problemu jest uszkodzony indeks. Zetknąłem się z tym problemem, gdy uszkodziłem indeks, modyfikując kod w IntelliJ podczas pisania komunikatu zatwierdzenia w wierszu polecenia. Usunięcie indeksu nie niszczy twoich zmian, po prostu je odznacza.
Pirolistyczny
3

Próbuję innego rozwiązania i to działa dla mnie. Poniżej są moje opcje

#cd .git
#rm index
#cd ..
#git add .
wqycsu
źródło
jak powiedział @farincz, musisz ponownie utworzyć indeks, dzwoniąc w git resetprzeciwnym razie fatal: Could not reset index file to revision 'HEAD' .
kuskmen
1

Jeśli tak się stanie w submodule

Plik indeksu znajduje się w .gitkatalogu nadrzędnym :

.git/modules/your_project_structure/index

W podmodule nie ma nazwanych katalogów .git(przynajmniej w projekcie, nad którym pracuję), jest tylko jeden.git plik, który mówi ci (i git), gdzie szukać katalogu git tego projektu.

Status Git pokazuje zmiany, których nie wprowadziłem

Po usunięciu plików indeksu i wykonaniu a git reset, znalazłem się w obliczu wielu niewytłumaczalnych zmian i twardy reset nie pomógł.

Ostrzeżenie , że stracisz wszystkie zmiany, więc zatwierdź je i pchnij, zanim przejdziesz dalej.

Indeks wydawał się uszkodzony, więc usunąłem go za pomocą następujących poleceń.

git rm -rf --cached .
git reset --hard HEAD
Emile Bergeron
źródło
0

Właśnie dostałem ten błąd w Github Desktop Client (OSX). Wszystko, co zrobiłem, to zamknąłem aplikację i otworzyłem ją ponownie, a potem zaczęła działać.

Oren
źródło