Rinominare Git da index.lock all’indice fallito

Usando il client Windows GitHub ho fatto una sincronizzazione per effettuare le modifiche remote sul mio computer locale, ma prima di terminare la sincronizzazione, ho esaurito lo spazio su disco e la sincronizzazione non è riuscita. Ora mi sembra di avere un sacco di modifiche locali che sono in realtà cambiamenti che sono stati estratti dall’origine. Ho provato a lanciare git pull ma ho ottenuto:

C:\Users\Tom\SourceLog [master +4 ~26 -0 !]> git pull Updating b3a86e1..5afd74f error: Your local changes to the following files would be overwritten by merge: SourceLog.Interface/IChangedFile.cs SourceLog.Interface/ILogEntry.cs ... Please, commit your changes or stash them before you can merge. error: The following untracked working tree files would be overwritten by merge: Lib/MSBuildExtensionPack/4.0.6.0/Ionic.Zip.dll Lib/MSBuildExtensionPack/4.0.6.0/MSBuild.ExtensionPack.dll ... Aborting 

Quindi ora sto cercando di scartare i cambiamenti locali, ma sto ottenendo:

 C:\Users\Tom\SourceLog [master +4 ~26 -0 !]> git checkout -- . Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) y Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) n fatal: unable to write new index file 

Come posso pulire questo? (Non ho avuto modifiche locali prima di avviare la sincronizzazione.)

Aggiornare

Non riesco a resettare la testa ..

 C:\Users\Tom\SourceLog [master +4 ~0 -0 !]> git reset head Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) y Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) n error: Could not write new index file. fatal: Could not reset index file to revision 'head'. 

Sembra che il seguente processo abbia un blocco sul file .git\index :

 ssh-agent.exe C:\Users\Tom\AppData\Local\GitHub\PortableGit_8810fd5c2c79c73adcc73fd0825f3b32fdb816e7\bin\ssh-agent.exe 

Ho ucciso il processo e ho eseguito git reset HEAD e sembra che sono tornato alla normalità ora.

La mia soluzione è stata ricreare l’ index (mantenendo intatto il worktree):

 del .git\index git reset --mixed head 

Per eliminare le modifiche locali, vai

 git reset HEAD 

Quindi controlla il tuo vecchio commit, cancella quello nuovo e tira di nuovo.

 git checkout "hashOld" git branch -d "hashNew" git pull 

Ho avuto un problema simile con Git. La soluzione per me era eliminare la soluzione localmente tramite Windows Explorer e quindi ripetere la clonazione del repository. Ciò ha rimosso tutti i file che sono stati memorizzati localmente sul mio computer e ha provocato il

 Rename from '.git/..' to '.git/..' failed. Should I try again? (y/n) y 

andando via. Dopo aver clonato il respository, ho provato di nuovo il mio comando (che nel mio caso era GIT COMMIT) e l’errore non si è ripresentato.

Il problema si è verificato quando stavo cercando di risolvere un conflitto di merge che stava accadendo dopo aver unito un ramo di funzionalità nel ramo di sviluppo.

Git 2.10 (Q3 2016, 4 anni dopo) dovrebbe migliorare la situazione su Windows

Vedi commit 05d1ed6 (23 ago 2016) di Ben Wijen ( Ben ) .

mingw : assicurati che gli handle di file temporanei non siano ereditati dai processi figli

Quando l’indice è bloccato e i processi figlio ereditano l’handle su detto blocco e il processo padre vuole rimuovere il blocco prima che il processo figlio esca, su Windows c’è un problema: non funzionerà perché i file non possono essere cancellati se un processo tiene una maniglia su di loro.

Il sintomo:

 Rename from 'xxx/.git/index.lock' to 'xxx/.git/index' failed. Should I try again? (y/n) 

bInheritHandles==FALSE processi figlio con bInheritHandles==FALSE non funzionerebbe perché non verranno ereditati handle di file, nemmeno gli handle STARTUPINFO in STARTUPINFO (stdin / stdout / stderr).

L’apertura di ogni file con O_NOINHERIT non funziona, come ad es. git-upload-pack aspetta handle di file ereditati.

Questo ci lascia con l’unica via d’uscita: creare file temporanei con il flag O_NOINHERIT . Questo flag è specifico per Windows, comunque.
Per i nostri scopi, è equivalente a O_CLOEXEC (che non esiste su Windows), quindi basta aprire i file temporanei con il flag O_CLOEXEC e mappare tale flag su O_NOINHERIT su Windows .

O uccidi il processo che sta bloccando il file o se è un nuovo repository, della cartella .git rm -rf .git e ricomincia da capo con git init

Ho ricevuto questo errore più volte di seguito durante l’esecuzione di git reset HEAD in un progetto archiviato in una cartella di Google Drive, ma dopo alcuni minuti il ​​problema è andato via.

Ho rimosso index e index.lock (nella cartella .git ) e ho eseguito git checkout . per annullare le modifiche e risolto, ma se volessi eseguire il commit delle modifiche avrei eseguito git add -A dopo git commit -m "description"

Stavo vedendo questo Rename from '.git/index.lock'... durante il tentativo di esecuzione

git checkout -b my-branch

La soluzione per me era di eseguire la riga di comando come admin .

In particolare, stavo usando l’eccellente applicazione del cmder come non amministratore, che ha portato alla visualizzazione del messaggio di rinomina. Eseguendo cmder come amministratore, eseguendo nuovamente il checkout, ha funzionato correttamente .