git index.lock Il file esiste quando provo a eseguire il commit, ma non riesco a eliminare il file


197

Quando eseguo 'git commit', ottengo quanto segue:

fatal: Unable to create 'project_path/.git/index.lock': File exists.

Tuttavia, quando lo faccio ls project_path/.git/index.lock, dice che il file non esiste. Qualche idea su cosa dovrei fare? Ho anche notato che project_path / .git è di proprietà di root, non sono sicuro che abbia qualcosa a che fare con il problema che sto riscontrando.

la versione git è 1.7.5.4

modifica: Sembra che il problema molto probabilmente fosse un altro processo che stavo eseguendo, che stava scrivendo (a mia insaputa) nella directory del progetto. Ho riavviato la mia macchina e quindi non ho avuto problemi con il commit.


3
Potrebbe benissimo essere un problema di autorizzazioni in cui Git presume che poiché non è in grado di creare il file esiste già. Hai provato a prendere la proprietà della directory o eseguire il tuo comando usando sudo?

1
Penso che la tua spiegazione su un'altra app che accede al repository git sia corretta. Ha avuto lo stesso problema durante un rebase. Gitx stava correndo. Una volta che ho smesso, git ha funzionato bene.
The Who

2
@asahi: vuoi forse accettare una risposta? Questo aiuterà i futuri lettori.
MERose


3
@asahi: puoi pubblicare il contenuto della tua modifica (che era la soluzione) come risposta e accettarlo. (Anche se la soluzione più generale di "riavviare la macchina" è che un altro processo stava accedendo alla directory; il riavvio tagliava semplicemente il nodo gordiano nel tentativo di capire quale e perché.:) Nel mio caso, era il mio IDE.) Ad ogni modo, le persone spesso rispondono alle proprie domande quando trovano le proprie soluzioni, cosa che hai fatto tu.
Wilson F,

Risposte:


328

Questa potrebbe essere una vecchia risposta, ma spero che questo sia più utile sul prossimo che ha bisogno di questa soluzione.

Su linux / unix / gitbash / cygwin, provare

rm -f .git/index.lock

Al prompt dei comandi di Windows, prova:

del .git\index.lock


1
Vedo che a volte il file di blocco viene eliminato automaticamente. Qualche idea sul perché questo file debba essere eliminato manualmente a volte?
Nrj

Non ho un index.lock, cosa faccio? :(
Alex C

56
Dato che il problema nella domanda era che non era in grado di eliminare il file, perché pensi che provare a eliminare il file dovrebbe essere la soluzione?
skyking

4
Per me la chiusura e l'apertura di SourceTree hanno risolto il problema ... Suppongo temporaneamente.
Andrew,

1
@skyking nella domanda originale c'è un errore che dice fatal: Unable to create 'project_path/.git/index.lock': File exists., dice "Il file esiste" ed eliminarlo sarebbe una soluzione semplice. Perché dovrei suggerire di eliminare un file se non è nemmeno nella domanda originale?
Ryan S,

40

Per Windows:

  • Da una console PowerShell aperta come amministratore, provare
> rm -Force ./.git/index.lock
  • Se ciò non funziona, è necessario interrompere tutti i processi git.exe
> taskkill /F /IM git.exe
SUCCESS: The process "git.exe" with PID 20448 has been terminated.
SUCCESS: The process "git.exe" with PID 11312 has been terminated.
SUCCESS: The process "git.exe" with PID 23868 has been terminated.
SUCCESS: The process "git.exe" with PID 27496 has been terminated.
SUCCESS: The process "git.exe" with PID 33480 has been terminated.
SUCCESS: The process "git.exe" with PID 28036 has been terminated.
> rm -Force ./.git/index.lock

1
Il parametro non può essere elaborato perché il nome del parametro 'f' è ambiguo.
3pitt

grazie, @MikePalmice, ho aggiornato a -Force. Sembra che abbiano cambiato l'API
Andrei Epure il

20

Su una piattaforma Windows che esegue Visual Studio 2015 RC (v4.6.00057) in combinazione con SourceTree (v1.6.14.0) fornirà anche questo errore.

Soluzione: supponendo che si desideri utilizzare l'albero dei sorgenti come gestore del codice sorgente, disabilitare semplicemente il provider del controllo del codice sorgente in Visual Studio in questo modo:

  1. Vai a: Strumenti> Opzioni> Controllo del codice sorgente
  2. Seleziona Plug-in di controllo del codice sorgente attuale come: Nessuno

Anche se il mio VS non dovrebbe nemmeno accedere a quei repository, questo era comunque il problema quando si rifaceva con SourceTree.
Kajetan il

Grazie, il problema è ancora presente con l'aggiornamento 3.
Elger Mensonides

Anche la chiusura di Visual Studio funziona (ha eliminato il file index.lock.)
misterbee,

10
  1. controlla se git è ancora in esecuzione (ps -ef | grep git)
  2. in caso contrario, rimuovere il file bloccato
  3. se sì, uccidi inizialmente il processo git.

9

provare

rm -f ./.git/index.lock

se non hai altri processi git in esecuzione, elimina semplicemente il file index.lock del rispettivo progetto.


Ha lavorato sull'ambiente del mio mac.
Adam Hurwitz,

6

Ho appena avuto questo problema ... Gitbox era in errore. Quindi forse hai avuto una GUI in esecuzione che stava causando problemi.


Non era una GUI ma avevo un processo separato che stava scrivendo nella directory del progetto. Non riuscivo a capirlo e mi stava facendo impazzire.
asahi,

Sembra che a GitX piaccia anche questo problema.
Glutexo,

6 anni dopo, fu Atom per me
Milk

6

Questo accade quando annulli la trazione dall'origine nel mezzo.

quindi quello che puoi fare è cancellare manualmente il file index.lock dalla tua directory .git.

rm -f ./.git/index.lock

cd nella directory del progetto ed eseguire questo comando.


8
Dato che il problema nella domanda era che non era in grado di eliminare il file, perché pensi che provare a eliminare il file dovrebbe essere la soluzione?
stelle l'

+1 @skyking. L'eliminazione di un file è ovvia, il problema è che non esiste alcun file da eliminare e il problema persiste.
Catsunami,

6
  1. Chiudi tutte le finestre che potrebbero influenzare questo file .git / index.lock
  2. Elimina il file .git / index.lock.
  3. Apri l'editor della riga di comando e cd nella posizione dei tuoi file git.

(Se il file viene creato, semplicemente da cd in quella posizione, il problema è il tuo editor. Chiudi il tuo editor. Non utilizzare nuovamente questo editor per questa attività. Apri un altro tipo di editor: Windows Power Shell o semplicemente cmd. Ora puoi usare i comandi git per continuare)


5

Probabilmente (è successo a me), il comando ls sta dicendo che non esiste perché l'utente corrente non ha i permessi per raggiungere quella directory o file.

Rimuovi il lucchetto e assicurati di eseguire git con l'utente giusto per evitare problemi di autorizzazione.

Se ti trovi in ​​una scatola GNU / Linux con il comando sudo :

sudo rm project_path / .git / index.lock


In Windows, puoi verificare se la cartella è di sola lettura con il tasto destro del mouse-> Proprietà-> Attributi.
Matt,

Dato che il problema nella domanda era che il file era inesistente, perché pensi che provare a eliminare il file dovrebbe essere la soluzione?
stelle l'

@skyking I problemi di autorizzazione mostrano lo stesso errore. In effetti, sono arrivato a questa domanda perché il titolo. Ho scritto la mia risposta come una possibile soluzione e alcuni voti confermano che si verifica anche ad altre persone;)
caligari

@caligari Non esattamente. Il problema di autorizzazione dà un'altra risposta a ls project_path/.git/index.lock.
skyking

5

del .git\index.lock ha funzionato per me.

Stavo affrontando questo problema durante il checkout di un nuovo ramo dal ramo principale.

Il checkout si è verificato facilmente dopo aver eliminato il index.lockfile.


4

A volte Git crea un file di blocco associato al repository mentre si apportano modifiche o molto probabilmente quando si utilizzano moduli secondari. Il messaggio di errore ti mostrerà il percorso del file di blocco. Correzione: basta andare manualmente al percorso nel terminale ed eliminare il file di blocco da $ rm index.lock

Dovrebbe aiutare.


4

Ho avuto questo problema con SourceTree quando ho cambiato ramo facendo doppio clic su di esso. Il problema non è molto comune e Atlassian lo sa ma hanno deciso di non risolverlo.

Fortunatamente, c'è una soluzione. Invece di fare doppio clic sul ramo che si desidera cambiare, basta fare clic con il tasto destro e selezionare "Acquista [nome ramo]". Dovrebbe riuscire ora.


grazie, fare clic con il tasto destro> checkout funziona come alternativa. il messaggio di errore è abbastanza fuorviante soprattutto quando index.lock non esiste.
Ernest

4

Mi sono imbattuto nello stesso scenario. Non ho nemmeno apportato alcuna modifica al mio codice locale. Ho appena modificato un file e ripristinato. Ho semplicemente cancellato il file sottostante nella cartella nascosta .git. Ha funzionato!

project_path / .git / index.lock


3

A meno che tu non abbia effettivamente intenzione che root possieda il tuo repository, sembra che tu abbia accidentalmente eseguito un comando Git come root (forse anche il clone / init iniziale). Se intendevi farlo, dovrai convivere con l'esecuzione di tutti i comandi Git nel repository come root. Se non lo hai fatto, corri sudo chown your-user[:your-group] -R .gita prenderne la proprietà e poi vedi se le cose funzionano.


Nel mio caso avevo incasinato la modalità di file e directory all'interno .gite li avevo corretti con: find .git -type f -exec chmod 644 {} \;e inoltre find .git -type d -exec chmod 755 {} \;avevo incasinato le modalità quando
spostavo il

Nel mio caso ho aggiunto il permesso di scrittura ai file .gitsudo chmod g+w .git -R
Beatriz Fonseca,

2

Più client git che lavorano sullo stesso repository locale competono per quel blocco. Ogni cliente dovrebbe attendere che il blocco venga rilasciato dall'altra parte per essere un buon cittadino. Per noi, SourceTree o MSVS sembrano fare un po 'di manutenzione in background mentre stavamo eseguendo script di commit di grandi dimensioni.

Forse 'git' stesso dovrebbe supportare un argomento '--retriesWhenLocked 5' per supportare i tentativi.o anche predefinito a questo quando eseguito manualmente.

Ecco un wrapper PowerShell attorno a git chiamato "gitr" che riprova fino a quando index.lock scompare, usando 5 tentativi predefiniti, 3 secondi tra ciascuno. Non rimuove mai index.lock, presupponendo che l'utente debba intervenire. È stato estratto da uno script di commit più grande. Ha solo test minimi con argomenti semplici.

  • Copia lo script in C: \ bin e aggiungi C: \ bin in $ PATH.
  • Da PS1> gitr --help
  • Da DOS%> powershell gitr --help

gitr.ps1

    #requires -version 2
    <#
    .SYNOPSIS
        gitr
    .DESCRIPTION
        Run "git" as an external process with retry and capturing stdout stderr.
    .NOTES  
      2017/05/16 crokusek: Initial version
    #>

    #---------------------------------------------------------[Initializations]--------------------------------------------------------

    #Set Error Action 
    $ErrorActionPreference = "Stop";

    #----------------------------------------------------------[Declarations]----------------------------------------------------------

    $scriptDir = Split-Path $script:MyInvocation.MyCommand.Path
    #Set-Location $scriptDir

    ## Disabled logging
    # Log File 
    # $logFile = "$($scriptDir)\getr.log"
    # If (Test-Path $logFile) { Clear-Content $logFile }

    #-----------------------------------------------------------[Functions]------------------------------------------------------------

    Function Log([string]$msg, [bool]$echo = $true)
    {
        $timestamp = "$(get-date -Format 'yyyy/MM/dd HH:mm:ss'):  " 
        $fullmsg = $msg -replace '(?ms)^', $timestamp  # the (?ms) enables multiline mode

        ## Disabled Logging 
        # Add-content $LogFile -value $fullmsg

        if ($echo)
        {
            Write-Host $msg
        }
    }

    Function ExecSimple([string]$command, [bool]$echo=$true, [bool]$stopOnNonZeroExitCode=$true)
    {
        $command, $args = $command -split " "
        return Exec $command $args $echo $stopOnNonZeroExitCode
    }

    Function Exec([string]$exe, [string[]]$arguments, [bool]$echo=$true, [bool]$stopOnNonZeroExitCode=$true)
    {   
        # Passing $args (list) as a single parameter is the most flexible, it supports spaces and double quotes

        $orgErrorActionPreference = $ErrorActionPreference 
        Try
        {           
            $error.clear()  # this apparently catches all the stderr pipe lines

            if ($false -and $exe -eq 'git')  # todo make this a generic flag
            {
                $exe = "$($exe) 2>&1"
            }

            $output = ""

            $argflattened = $arguments -join ' '
            Log "`n% $($exe) $($arguments)`n"

            # This way some advantages over Invoke-Expressions or Start-Process for some cases:
            #      - merges stdout/stderr line by line properly, 
            #      - echoes the output live as it is streamed to the current window,
            #      - waits for completion
            #      - works when calling both console and windows executables.
            #       
            $ErrorActionPreference = "Continue"  # required in order to catch more than 1 stderr line in the exception

            if ($echo)
            {
                # Using "cmd.exe" allows the stderr -> stdout redirection to work properly.  Otherwise the 2>&1 runs after PS for 
                # some reason.  When a command such as "git" writes to stderr, powershell was terminating on the first stderr 
                # line (and stops capturing additional lines).
                #
                # but unfortuantely cmd has some bizarre de-quoting rules that weren't working for all cases. 
                #& cmd /c "`"" $exe $arguments "`"" | Tee-Object -variable output | Write-Host | out-null           

                # This is simplest but has some issues with stderr/stdout (stderr caught as exception below)
                #
                & $exe $arguments 2>&1 | tee -variable output | Write-Host | out-null 
            }
            else
            {           
                & $exe $arguments 2>&1 | tee -variable output | out-null 
            }

            $output = $output -join "`r`n"                  

            if ($stopOnNonZeroExitCode -and !$LASTEXITCODE -eq 0)
            {           
                throw [System.Exception] "Exit code ($($LASTEXITCODE)) was non-zero. Output:`n$($output)"
            }       
        }
        catch [System.Management.Automation.RemoteException]
        {
            $output = $_.Exception.ToString().Replace("System.Management.Automation.RemoteException:", "").Trim()

            if ($output.Contains("fatal")) 
            {
                throw 
            }

            if ($echo)
            {
                Log $output
            }
        }
        finally
        {
            $ErrorActionPreference = $orgErrorActionPreference;
        }

        if (-not $output -eq "")
        {
            Log $output $false  # don't echo to screen as the pipe above did    
        }

        return $output
    }

    Function ExecWithRetry([string]$exe, [string[]]$arguments, [bool]$echo=$true, [bool]$stopOnNonZeroExitCode=$true, 
                          [int]$maxRetries = 5, [int]$msDelay = 3000, [AllowNull()][string]$exceptionMustContain = $null)
    {
        for ($i = 0; $i -lt $maxRetries; $i++)
        {
            try
            {
                Exec $exe $arguments $echo $stopOnNonZeroExitCode
                return
            }
            catch
            {
                if (-not [string]::IsNullOrEmpty($exceptionMustContain) -and $_.Exception.ToString().Contains($exceptionMustContain))
                {
                    Log "Last Error from $($exe) is retryable ($($i + 1) of $($maxRetries))" $true
                    Start-Sleep -Milliseconds ($msDelay);
                    continue
                }

                throw
            }
        }

        throw [System.Exception] "Unable to successfully exec '$($exe)' within $($maxRetries) attempts."
    }

    Function GitWithRetry([string[]]$arguments, [bool]$echo=$true)
    {
        ExecWithRetry "git" $arguments $echo -exceptionMustContain "Another git process seems to be running"
    }

#-----------------------------------------------------------[Main]------------------------------------------------------------

function Main([string[]]$arguments)
{   
    GitWithRetry @($arguments)
}


#-------------------------------------- Startup ------------------------------------
try 
{
    Main $args
    Exit 0
}    
catch
{
    #Log "*** A fatal error occured: $($_.Exception)"
    #Read-Host -Prompt "`nA fatal error occurred, press enter to close."    
    exit 1
}

2

Ho anche questa domanda in Windows 10.

quando provo del ./.git/index.lock, mi ha dettocannot remove 'index.lock': Device or resource busy

Finalmente ho capito il motivo:

il computer ha due processi per usare git:

  • git bash
  • cmder

quindi uso cmder.exe per evitare git commiterrori.

quindi la soluzione è usa git basho termina git bashquindi usa cmder.exe


1

Ho avuto esattamente lo stesso errore, ma il problema non era il file di blocco. Invece il problema era che avevo copiato il contenuto di un altro repository git in questo repository, inclusa la cartella invisibile .git. Quindi, SourceTree era confuso su quale repository volevo mettere in scena i file (c'era una discrepanza tra il repository SourceTree che pensavo fossi, e quello in cui il contenuto della mia directory .git incorporata diceva che dovevo essere).


1

Ho avuto questo problema con TortoiseGit con Cygwin su Windows. Non sono stato in grado di eliminare remove ./.git/index.lock anche con privilegi di amministratore, ho provato sia Cygwin che il prompt dei comandi, ha detto che il file era in uso da un altro processo.

Ho scoperto che avevo 2 istanze di TortoiseProc.exe in esecuzione. Ne ho ucciso uno e ho chiuso tutte le finestre di Windows Explorer, quindi sono stato in grado di eliminare il file. Non so se uccidere un'istanza di TortoiseProc.exe fosse la soluzione o chiudere Windows Explorer.


1

La soluzione per me era eliminare il file .index e consentire a Git di ricostruirne un altro.


1

Non avevo un file inex.lock da eliminare, ma ciò che ha funzionato per me è stata la rimozione del controllo di sola lettura dalla finestra Attributi della finestra di dialogo Proprietà cartella.


1

Ho creato un file index.lock vuoto, l'ho eliminato usando il comando windows


1

A partire da git 2.8.4 (giugno 2016) , questo non dovrebbe più accadere.

Vedi il problema 755 che dovrebbe anche alleviare il problema ( commit 2db0641 ):

Assicurarsi che gli handle di file temporanei non siano ereditati dai processi figlio

Impedire ai processi figlio di ereditare un handle per index.lock.


1

Nella mia applicazione sourceTree non sono in grado di eseguire il commit o passare a qualsiasi altro commit / brach. Quella volta mostra errori come

fatale: impossibile creare blah blah blah ..

Ho semplicemente risolto questo problema con la cartella .git (nel progetto Explorer Dir). Ed elimina l'indice ----- [tipo di file: file LOCK]. Ora torno a tutti gli accessi in sourceTree ..

assicurati che il file di blocco dell'indice .. supponi di non ottenere il tipo di file, modificare le impostazioni di visualizzazione dei file nel computer. Nota: la cartella .git è normalmente un tipo nascosto di cartella.


1

Quello che ha fatto per me è stato:

git rebase --abort e riavviare il rebase.

Come ha detto Andrew stavo anche usando PHPStorm quando questo è successo. Non è stato necessario chiuderlo però.


1

Per prima cosa devi navigare nella cartella specifica del tuo progetto. Come se il nome del tuo progetto fosse Firstproject, quindi prima vai nella directory del progetto .. quindi digita cd .git quindi dopo essere passato alla cartella git digita del index.lock Dopo la cancellazione del file index.lock .. Sarai in grado di eseguire il commit e il push come prima


1

Nel mio caso, era Windows, non completamente chiuso.

Windows è in letargo, si rifiuta di montare

È probabile che Windows sia davvero in letargo. Windows lo fa automaticamente quando gli dici di spegnerlo normalmente. Il vantaggio è che si ottiene un tempo di avvio apparente più veloce.

Per arrestare Windows senza ibridazione, eseguire quanto segue al prompt dei comandi (in Windows):

shutdown /s

Potresti anche voler includere /t 0per l'arresto immediato.

Ho trovato un bel tutorial per configurare un lanciatore per questo: Come eseguire un arresto completo in Windows 8 senza disabilitare l'avvio ibrido.

L'approccio più semplice all'arresto effettivo di Windows è di "riavviare" (anziché "arresto"), ma di intercettare il processo di avvio e avviare Linux invece di lasciarlo avviare Windows.

credito : nobar


1

Questo può accadere anche se stai usando un client git della riga di comando alternativo, come hub .

Sto usando hub come sostituto di alias per git da un paio d'anni, ma recentemente ho scritto uno script bash che fa un sacco di git al suo interno e ho iniziato a ottenere questo problema di blocco dell'indice.

Non sono riuscito a trovare la correzione finché non mi sono ricordato che stavo eseguendo hub invece di git. L'ho rimosso e il problema è andato via!


0

Ottenere l'errore:

Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
fatal: Unable to create '/home/user/project/.git/index.lock': File exists.

If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.

Ma non sono riuscito a trovare (né eliminare) quel file .git / index.lock.

Nel mio caso, git-cola stava correndo!

Ovviamente crea quel .git / index.lock di tanto in tanto, o causato dal rebase che stavo facendo sulla riga di comando e durante il quale ho ricevuto quell'errore - quindi git-cola ovviamente "disturba" l'esecuzione della riga di comando di Git (o alcune operazioni della CLI di Git).

Questo si risolve chiudendo git-cola durante una git rebase da riga di comando.


0

A volte un altro client Git può interferire quando ne sono installati più.

Vale a dire. assicurarsi con Task Manager o Get-Processche TGitCacheda TortoiseGit non sia attivo in background.


0

Ho avuto lo stesso problema di recente. Se si controlla l'intero messaggio di errore, si dice anche che ci sono alcuni processi che utilizzano il processo git che ti impedisce di eliminare index.lock. Potresti avere IDE aperto come Visual Studio o software correlato in cui git è integrato. Chiudilo e prova a riporre il tuo file. Spero che sia d'aiuto.

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.