Git "fatal: Unable to write new index file"


128

Ho visto molti degli altri thread su questo e non aiutano.

Ho un repo molto semplice: due file JavaScript. Ho più di 100 GB su Macbook. Quando provo a spostare i file in una sottodirectory e mettere in scena localmente le modifiche che ottengo ...

irreversibile: impossibile scrivere un nuovo file di indice

Questo accade se eseguo tutte le azioni nel terminale o se utilizzo una GUI come SourceTree. Inoltre, uno dei file viene bloccato e non è possibile eliminare la directory di lavoro finché non si disconnette e si riconnette.

Perché sta succedendo? Il blocco impedisce a qualcosa di mettere in scena? In tal caso, cosa / come faccio a sbloccare il file problematico su OS X ?? Il repository remoto è Google Code, se questo fa la differenza, anche se non sto ancora spingendo al telecomando. Tutto è locale.


Non sei sicuro che questo dovrebbe andare a SuperUser invece?
MMM

molto probabilmente un problema con i diritti di accesso (l'utente che esegue git non ha il permesso di scrittura per tutto il repository)
Nevik Rehnel

Ci sono discussioni su questo in SO e SU. Penso che la domanda funzioni altrettanto bene in entrambe. Nevik, i permessi per il repo sono 777, inclusa la ./gitcartella.
Jeff

Quando vedi questo problema? È quando esegui un "git mv" o "git add"?
Mayur Nagekar

Risposte:


221

Nel mio caso, lo spazio sul disco era esaurito, quindi ho dovuto eliminare i file dal disco rigido per fare spazio.


64

Ho avuto lo stesso problema negli ultimi giorni. Fondamentalmente, a mia insaputa, l'intero repository era stato spostato in un nuovo filesystem, quando ho provato a eseguire git status, all'improvviso è stato segnalato che ogni file nel repository era stato aggiornato.

Possibili soluzioni

Quindi, dopo molte ricerche su Google, ho provato quanto segue:

  • modifica delle autorizzazioni .git (stesso problema)
  • modifica delle autorizzazioni .git / index (stesso problema)
  • git aggiungendo tutte le modifiche per eseguire il commit (stesso problema)
  • git rm-ing file cancellati, poiché riportavano errori di nome file troppo lunghi (stesso problema)
  • git reset (soft | Head | Hard) (stesso problema)
  • git clean (stesso problema)
  • spegnere Windows Defender (stesso problema)
  • aggiornamento di git (stesso problema)
  • client git diversi (io uso gitbash) (stesso problema)
  • bere 2 caffè invece di 1 (stesso problema)

tl: dr - soluzione sporca

L'unica cosa che è riuscita a risolvere il problema è stata copiare il file indice, eliminare l'originale e rinominare la copia.

So che non è proprio una "soluzione" ma ora funziona magicamente> <, con tutti i file / rami intatti. Se qualcuno sa perché potrebbe funzionare, lo dica.


82
Trovata un'altra causa: potresti non avere più spazio su disco.
lennartcl

21
Nel mio caso, Google Drive stava caricando (eseguendo il backup) dei file e questi sono stati bloccati durante il processo. Dopo aver completato il caricamento, il commit ha funzionato.
Kristjan O.

3
Grazie per il suggerimento su Google Drive. Ho avuto lo stesso problema, ma con Dropbox.
hgolov

1
Restart ha funzionato per me. Lavorare su un disco condiviso mezzo vuoto da 22 TB, quindi lo spazio non era un problema.
Wayne F. Kaskie

1
la tua "soluzione sporca" ha funzionato per me (è tornato a un file di indice precedente, aggiunto di nuovo e
reimpegnato

19

Nel mio caso, la sospensione della sincronizzazione di Dropbox ha risolto il problema


17

Ho avuto lo stesso problema su un Mac. Sembra essere causato da ACL del file system. Prova chmod -RN /path/to/repoa cancellare gli ACL. Dopo aver fatto ciò, sono stato in grado di eseguire il commit delle modifiche. Utilizzando il trucco per copiare il file di indice, eliminare l'originale e spostare la copia indietro ha ottenuto lo stesso risultato.


Se il tuo account utente ha avuto di recente problemi di autorizzazione, potresti incorrere in questo problema. Nel mio caso, è stato un problema di integrazione con Active Directory che mi ha lasciato con gli ACL problematici.
kris

17

Se hai configurato GitHub in una sorta di servizio di sincronizzazione online, come Google Drive o Dropbox, prova a disabilitare la sincronizzazione poiché il servizio di sincronizzazione tenta di leggere / scrivere sul file mentre GitHub tenta di fare lo stesso, causando il mancato funzionamento di GitHub correttamente.


Questa è la soluzione che ha funzionato per me. Grazie!
Macondo

7

Mi è capitato che il file .git / index fosse utilizzato da un altro processo (il mio server web di sviluppo locale). Ho interrotto il processo e poi ha funzionato.


7

La chiusura di Visual Studio Code (che nel mio caso ha un processo in background con caricamento automatico in esecuzione sul salvataggio di file) ha risolto il problema per me.

Credito per la soluzione: il mio amico e collega Arnel.


Ho chiuso il server nodeJs in cui era in esecuzione la mia app angularJs e l'indice è stato sbloccato
Radu Linu


6

Nel mio caso, la soluzione consisteva solo nell'aggiungere l'autorizzazione al nuovo utente.

Quando ho installato il nuovo sistema operativo, ho spostato i miei repository e mostrava questo errore esatto, ho selezionato la cartella principale e quindi ho aggiunto l'utente autenticato per controllare tutto inserisci qui la descrizione dell'immagine


3

Avevo ACL (in qualche modo) allegato a tutti i file nella cartella .git.

Controllalo con ls -lenella cartella .git.

Puoi rimuovere l'ACL con chmod -N(per una cartella / file) o chmod -RN(ricorsivo)


3

Penso che alcune soluzioni di backup in background come Google Backup e Sync blocchino l'accesso al file di indice. Ho chiuso l'applicazione e Sourcetree non ha avuto alcun problema. Sembra che Dropbox faccia lo stesso (@tonymayoral).


2

Nel mio caso si trattava di un EGit in esecuzione simultanea. Dopo aver riavviato eclipse funziona come al solito.


la domanda è "perché viene visualizzato il messaggio di errore?" e questa risposta descrive un'altra potenziale causa.
Robm

2

Se utilizzi un computer Windows, assicurati che il programma che stai utilizzando, che si tratti di albero dei sorgenti o di un terminale git, sia in esecuzione come amministratore. Ho ricevuto lo stesso messaggio di errore esatto. È possibile fare clic con il pulsante destro del mouse sul programma per eseguirlo come amministratore o modificarne le proprietà per eseguirlo sempre come amministratore.


2

Non avere abbastanza spazio è un problema. Pulisci e riprova


2

Ho avuto lo stesso problema. Ho riavviato il computer e il problema è stato risolto.


1

hai provato "git add." . saranno tutti i cambiamenti? (puoi rimuovere i file aggiunti non necessari con git reset HEAD)


1

Il messaggio di errore fatal: Unable to write new index fileindica che non è stato possibile scrivere il nuovo contenuto nel file di indice git .git\index(vedere qui per ulteriori informazioni sull'indice git). Dopo aver esaminato tutte le risposte a questa domanda, riassumo le seguenti cause principali:

  • La dimensione del nuovo contenuto supera la capacità disponibile del disco. ( Soluzione : pulire gli spazi su disco)
  • Gli utenti non hanno il diritto di accesso a questo file. ( Soluzione : concedere l'autorizzazione)
  • Gli utenti dispongono dell'autorizzazione ma .git\indexsono bloccati da altri utenti o processi. ( Soluzione : sblocca il file)

Il collegamento Scopri quale processo sta bloccando un file o una cartella in Windows specifica il seguente approccio per scoprire il processo che sta bloccando un file specifico:

SysInternals Process Explorer - Vai a Trova> Trova handle o DLL. Nella casella di testo "Handle o sottostringa DLL:", digitare il percorso del file (ad esempio "C: \ percorso \ a \ file.txt") e fare clic su "Cerca". Dovrebbero essere elencati tutti i processi che hanno un handle aperto per quel file.

Utilizzare l'approccio precedente per trovare quale processo bloccato .git\indexe quindi interrompere il blocco eseguibile. Questo sblocca .git\index.

Ad esempio, Process Explorer Search mostra che .git\indexè bloccato da vmware-vmx.exe. La sospensione della macchina virtuale VMWare Player (che accedeva al repository git tramite una cartella condivisa) ha risolto il problema.


Sebbene questo collegamento possa rispondere alla domanda, è meglio includere le parti essenziali della risposta qui e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - Dalla recensione
Al Sweigart

@ Al, ho aggiornato la mia risposta in base al tuo suggerimento.
Fan

0

SE OTTIENI QUESTO DURANTE UN REBASE:

Ciò è molto probabilmente causato da alcuni software che bloccano il file di indice del repository, come software di backup, antivirus, IDE o altri client git.

Nella maggior parte dei casi il blocco è solo per un breve momento e quindi accade solo per cattivo tempismo e sfortuna.

Tuttavia, git rebase --continuesi lamenterà del fatto che il prossimo comando è un commit vuoto:

The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:

    git commit --allow-empty

Per risolvere questo problema, corri git resete riprova git rebase --continue.


0

Problema: quando stavo controllando alcuni file modificati in git, ho ricevuto questo errore. Avevo due utenti ABC e XYZ. i file hanno uid: gid di ABC ma non ha accesso a git e sta cercando di estrarre i file con lo stesso.

La soluzione che ho provato: XYZ ha accesso a git, ho provato a controllare i file con sudo e ha funzionato .. !!


0

Ecco cosa ha funzionato per me:

Contesto:

  1. Costruire un progetto su un server

  2. git status restituisce a HEAD detached at <commit-SHA>

  3. Qualunque operazione ho fatto localmente, ho avuto questo errore. Più specificamente:

    • git checkout
    • git reset HEAD --hard

Soluzione

  1. File semplicemente rimosso <work-dir>/.git/index.
  2. Un git statusindica che tutti i file nel progetto non vengono tracciati (nessuna sorpresa qui).
  3. git reset HEAD --hard
  4. Torna a HEAD detached at <commit-SHA>quando si fa un git status, ma poi dovresti essere in grado di farlo
  5. git checkout <some-branch>

e sei di nuovo in pista!

!! IMPORTANTE !!

Funziona solo perché sto costruendo "merly". Nessuna preziosa modifica è stata eseguita sul codice. Se sei effettivamente in "tempo di sviluppo", ti consiglio di salvare prima il tuo lavoro o di utilizzare un altro metodo.

Spero che possa aiutare :).


0

Ho avuto questo problema utilizzando GitExtensions su Windows. Risolto il problema con la concessione dell'autorizzazione completa per l'utente corrente (io) sulla cartella che conteneva il repository.

Un'altra volta, anche se stavo ricevendo l'errore da Git Extensions, sono stato in grado di eseguire il commit degli stessi file da Visual Studio 2015.

Un'altra volta ho dovuto eliminare il file "index" dalla cartella .git


0

Il mio caso è un po 'interessante:

Eseguo git log per controllare un certo commit, poi non l'ho chiuso correttamente, premo ctrl + c per uscirlo.

Quindi l'indice sembra essere stato bloccato. Quindi eseguo nuovamente git log, quindi premo Q per chiuderlo.

Problema risolto. :)


0

Nel mio caso si trattava di nodemonun'istanza che controllava i cambiamenti del filesystem.

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.