Ottenere un errore fatale in git per le voci a più fasi


241

Usando Git versione 2.2.0 con motore di gioco unity su OS X, e volevo eseguire il commit del mio codice. Ho aggiunto tutto e non ho ricevuto un messaggio di errore. quindi commetti -m e ottenne questo messaggio di errore:

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

Non accorgermene che ho spinto, che non ha dato un messaggio di errore, in realtà Everything up-to-date ho detto Quindi ho controllato bitbucket (dove si trova il repository) e non ha mostrato il mio commit. quindi ho controllato il mio registro locale e anche questo non mostra il mio commit.

Ho cercato su Google una risposta ... e niente. che cos'è questo errore? e come posso ripararlo?


Quale versione di git o strumento stai usando? C'è stato un recente thread nell'elenco degli sviluppatori sul miglioramento del controllo per più voci dello stage. news.gmane.org/gmane.comp.version-control.git
Philip Oakley,

Sembra probabile che possa essere coinvolto il controllo extra in 2.2.0. "Assicurati che le voci non unite vengano rimosse" 12 agosto di Jaime Soriano Pastor, potrebbe essere un thread con cui iniziare.
Philip Oakley,

4
quindi perché succede?
Charlie Parker,

basta apportare una modifica fittizia al file suddetto e 'commit and sync'.
sajanyamaha,

Risposte:


381

La prima soluzione, che sembra funzionare con le recenti versioni di Git (2.3 e versioni successive, Q2 + 2015) è menzionato in concessione 's più up-to-date risposta :

  1. Elimina l'indice

    $ rm .git/index
    
  2. Aggiungi tutto

    $ git add -A
    
  3. Commettere

    $ git commit -a
    

Risposta originale (fine 2014)
La solita soluzione alternativa è:

  • clonare nuovamente il repository remoto in un nuovo repository locale
  • aggiungere le modifiche dal primo repository al secondo:

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

È possibile visualizzare questo messaggio di errore read-cache.c, discusso in questa patch (" read-cache.c: assicurarsi che le voci non unite vengano rimosse ") e introdotto nel commit di Git 2.2 .
Dato che è così recente, è possibile che il downgrade di Git a 2.1 sia sufficiente per non essere influenzato da quella patch.

L' OP Daniel Toebe aggiunge nei commenti :

Il problema si è verificato sul mio macbook, che ha deciso di fallire su di me e un altro incidente informatico mi ha lasciato indietro sui miei progetti.


@sharpner è possibile che si tratti di un bug o di un effetto collaterale di quella patch nel tuo caso.
VonC,

1
Ci scusiamo per la risposta ritardata ... Il problema si è verificato sul mio macbook, che ha deciso di fallire su di me, e un altro errore del computer mi ha lasciato indietro sui miei progetti.
Daniel Toebe,

1
@DanielToebe buon feedback. L'ho incluso nella risposta per una maggiore visibilità.
VonC,

Mi sono imbattuto nello stesso, dopo un tentativo digit commit -c sha
Chris Leishman,

2
Per qualsiasi interessato, questo è successo a me perché stavo modificando accidentalmente un file nella mia cartella .git invece del file stesso.
ostler.c,

166

Credo di aver riscontrato questo problema perché ho aggiunto e eseguito il commit delle modifiche e quindi eliminato un file che avevo appena eseguito il commit. Se questo sembra simile al tuo caso, ti consiglio di seguire quanto segue per salvare la clonazione e aggiungere manualmente le modifiche.

Sono stato in grado di risolvere questo problema eliminando il file .git / index nel mio repository, in modo simile a quanto suggerito da @slider (credo che abbia sbagliato a digitare il percorso).

rm .git/index

Quindi ho dovuto aggiungere e confermare nuovamente le modifiche locali

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

Sono stato quindi in grado di spingere da remoto.

Cos'è l'indice git e come è rilevante?

Qual è il problema con l'indice Git?

L '"indice" git è dove si posizionano i file che si desidera vengano impegnati nel repository git.

Prima di "eseguire il commit" (checkin) dei file nel repository git, è necessario innanzitutto posizionare i file nell '"indice" git.

Credo che eliminando questo file, git reindicizzerà il repository, ne creerà uno nuovo e il gioco è fatto. Risolve questo problema perché il repository locale viene reindicizzato senza il file che ho eliminato che ha causato tutta la confusione.

Modifica: sembra che questo sia legato al Mac (in base ai commenti), quindi se aiuta sono su OSX 10.10 e git versione 2.3.4 installato tramite brew.


1
Sì, ha funzionato e grazie per la spiegazione. Un avvertimento qui è prima di eseguire questa operazione: archiviare, spostare o eliminare tutti i file che non sono stati aggiunti all'elenco di modifiche predefinito corrente. Verranno risucchiati dalgit add -A
Kirby il

4
Confermalo su Mac OS X Yosemite. È successo mentre lavoravo in Android Studio, anche se non c'erano scenari riproducibili specifici ...
Disegnato il

4
Questa dovrebbe essere la risposta corretta perché funziona e ha una spiegazione migliore. Questo è successo anche a me.
Jared Burrows,

1
Ha funzionato anche per me. L'aggiunta della radice del controllo versione in IntelliJ ha risolto il problema, ma il rm'indice git ha funzionato bene. Grazie per la spiegazione @grant.
Andrew Eells,

1
Ho avuto anche questo problema quando IntelliJ era in esecuzione in background mentre stavo apportando alcune modifiche con VIM. Penso che ci fosse una condizione di gara in git. (In realtà, penso che ce ne siano molti.) Chiudere IntelliJ, rimuovere l'indice e ricominciare il mio lavoro ha funzionato bene.
Robert Fischer,

119

Per progetto

rm .git/index
git reset

dopo aver eliminato l'indice è necessario ricrearlo con git reset

Per sottomodulo:

Vai alla cartella principale del progetto

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

4
Il git resettato dopo la rimozione dell'indice lo ha inchiodato totalmente. Grazie! Se non ripristini, ogni file sarà nuovo nell'indice, quindi deve essere aggiunto. Il ripristino ricostruirà l'indice che sembra. Anche se non capisco come git possa ricostruire l'indice, senza un indice?
JosFabre,

1
@JosFaber Perché index non è cronologia di commit. In realtà si tratta di una struttura di supporto "ridondante". Vedi schacon.github.io/gitbook/7_the_git_index.html Quindi può essere completamente ricostruito confrontando l'albero di lavoro e HEAD. Ed è esattamente ciò che fa git reset. La pagina man dice: ... ripristina le voci di copia da <tree-ish> all'indice ...
farincz

2
Grazie! Senza il reset di git, voleva che aggiungessi di nuovo tutti i file già nel repository.
Robert Bernstein,

1
Uso sourcetree sul mio mac. Ho eliminato manualmente .git / index, quindi selezionato l'ultimo commit valido, ho fatto clic con il tasto destro, ho selezionato il master di reset (nel mio caso) a questo commento - quindi ho scelto l'opzione mista che lascia il mio lavoro in buono stato. Sono stato quindi in grado di impegnarmi nel mio lavoro attuale e ora tutto è salutare.
user216661

1
Il modo più pulito e veloce!
h4rd4r7c0r3,

29

Puoi rimuovere il file indice Git dal tuo progetto. Nella radice del progetto, eseguire il comando seguente:

rm .git/index

Dopo che git funziona.


3
Questo non risponde alla domanda. Per favore, arricchisci questa risposta con maggiori dettagli.
ArtOfCode

Non ha funzionato per me rm: /.git/index: No such file or directoryMac OSX Yosemite; git 2.3.4 installato tramite homebrew
concedi il

@grant Devi rimuovere la barra all'inizio. ( rm .git/indexnella tua directory git).
ChristophLSA,

2
@ChristophLSA grazie - ho risposto con una descrizione di ciò che fa questa azione per fornire chiarezza. Questa risposta può essere aggiornata in modo da riflettere il percorso corretto e informare gli utenti su cosa fa l'azione?
concedi il

1
So perché funziona. Il problema è causato da un indice danneggiato. Ho riscontrato questo problema quando ho corrotto l'indice modificando il codice in IntelliJ mentre scrivevo un messaggio di commit nella riga di comando. L'eliminazione dell'indice non distrugge le modifiche, ma semplicemente le mette in scena.
Pirolistico

3

Provo una soluzione diversa e funziona per me. Di seguito sono le mie opzioni

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

come ha detto @farincz, devi ricreare di nuovo l'indice chiamando git resetaltrimenti ti darà fatal: Could not reset index file to revision 'HEAD' .
Kuskmen,

1

Se ciò accade in un sottomodulo

Il file indice si trova all'interno della .gitdirectory principale :

.git/modules/your_project_structure/index

In un sottomodulo, non ci sono directory nominate .git(almeno nel progetto su cui sto lavorando), c'è solo un .gitfile che ti dice (e git) dove cercare la directory git di quel progetto.

Lo stato Git mostra le modifiche che non ho apportato

Dopo aver rimosso i file di indice e aver fatto un git reset, mi sono trovato ad affrontare molte modifiche inspiegabili e un hard reset non mi ha aiutato.

Attenzione , perderai tutte le modifiche, quindi impegnale e spingi prima di continuare.

L'indice sembrava corrotto, quindi l'ho rimosso con i seguenti comandi.

git rm -rf --cached .
git reset --hard HEAD

0

Ho appena ricevuto questo errore con Github Desktop Client (OSX). Tutto quello che ho fatto è stato chiudere l'app, riaprirla e poi ha iniziato a funzionare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.