git index.lock Plik istnieje, gdy próbuję dokonać zatwierdzenia, ale nie mogę go usunąć

197

Kiedy wykonuję polecenie „git commit”, otrzymuję następujące informacje:

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

Jednak kiedy to robię, oznacza ls project_path/.git/index.lockto, że plik nie istnieje. Wszelkie przemyślenia na temat tego, co powinienem zrobić? Zauważyłem również, że project_path / .git jest własnością root, nie jestem pewien, czy ma to coś wspólnego z problemem, z którym się spotykam.

wersja git to 1.7.5.4

edycja: Wygląda na to, że problemem najprawdopodobniej był inny proces, który miałem uruchomiony, czyli pisanie (bez wiedzy) do katalogu projektu. Uruchomiłem ponownie komputer, a następnie nie miałem problemu z zatwierdzeniem.

asahi
źródło
3
Może to być problem z uprawnieniami, gdy Git zakłada, że ​​ponieważ nie może utworzyć pliku, już istnieje. Czy próbowałeś przejąć na własność katalog lub wykonać polecenie za pomocą sudo?
1
Myślę, że twoje wyjaśnienie dotyczące innej aplikacji uzyskującej dostęp do repozytorium git jest poprawne. Miałem ten sam problem podczas rebase. Gitx działał. Kiedy odszedłem, wszystko działało dobrze.
The Who
2
@asahi: Może chcesz zaakceptować odpowiedź? Pomoże to przyszłym czytelnikom.
MERose
3
@asahi: Możesz opublikować treść swojej edycji (która była rozwiązaniem) jako odpowiedź, a następnie ją zaakceptować. (Chociaż bardziej ogólnym rozwiązaniem niż „ponowne uruchomienie komputera” jest to, że inny proces uzyskiwał dostęp do katalogu; ponowne uruchomienie po prostu przecina węzeł gordyjski, próbując dowiedzieć się, który i dlaczego.:) W moim przypadku było to moje IDE.) W każdym razie ludzie często odpowiadają na własne pytania, gdy znajdują własne rozwiązania, co Ty.
Wilson F

Odpowiedzi:

327

To może być stara odpowiedź, ale mam nadzieję, że będzie to przydatne w przypadku osób, które potrzebują tego rozwiązania.

W systemie linux / unix / gitbash / cygwin spróbuj

rm -f .git/index.lock

W wierszu polecenia systemu Windows spróbuj:

del .git\index.lock

Ryan S.
źródło
1
Widzę, że czasami plik blokady jest automatycznie usuwany. Wszelkie wskazówki, dlaczego czasami ten plik musi być ręcznie usuwany?
Nrj
Nie mam index.lock, co robię? :(
Alex C
56
Biorąc pod uwagę, że problemem w pytaniu było to, że nie był w stanie usunąć pliku, dlaczego Twoim zdaniem próba usunięcia pliku powinna być rozwiązaniem?
skyking
4
Dla mnie zamknięcie i otwarcie SourceTree rozwiązało problem ... Chyba tymczasowo.
Andrew
1
@ skyking w pierwotnym pytaniu zawiera błąd fatal: Unable to create 'project_path/.git/index.lock': File exists., który mówi „Plik istnieje”, a usunięcie go byłoby prostym rozwiązaniem. Dlaczego miałbym sugerować usunięcie pliku, jeśli nie ma go nawet w pierwotnym pytaniu?
Ryan S,
40

Dla Windowsa:

  • Z konsoli PowerShell otwartej jako administrator, spróbuj
> rm -Force ./.git/index.lock
  • Jeśli to nie zadziała, musisz zabić wszystkie procesy 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
Andrei Epure
źródło
1
Nie można przetworzyć parametru, ponieważ nazwa parametru „f” jest niejednoznaczna.
3pitt
dzięki, @MikePalmice, zaktualizowałem do -Force. Wygląda na to, że zmienili API
Andrei Epure
20

Na platformie Windows z uruchomionym programem Visual Studio 2015 RC (v4.6.00057) w połączeniu z SourceTree (v1.6.14.0) również ten błąd.

Rozwiązanie: Zakładając, że chcesz używać drzewa źródeł jako menedżera kodu źródłowego, po prostu wyłącz dostawcę kontroli źródła w programie Visual Studio w następujący sposób:

  1. Przejdź do: Narzędzia> Opcje> Kontrola źródła
  2. Wybierz opcję Bieżąca wtyczka kontroli źródła jako: Brak
WLCyPHlSpC
źródło
Mimo że mój VS nie powinien nawet uzyskiwać dostępu do tych repozytoriów, to i tak był problem podczas zmiany wersji na SourceTree.
Kajetan Abt
Dziękuję, problem nadal występuje z aktualizacją 3.
Elger Mensonides,
Działa także zamykanie programu Visual Studio (usunięto plik index.lock.)
misterbee,
10
  1. sprawdź, czy git nadal działa (ps -ef | grep git)
  2. jeśli nie, usuń zablokowany plik
  3. jeśli tak, najpierw zabij proces git.
Daniel YC Lin
źródło
9

próbować

rm -f ./.git/index.lock

jeśli nie masz uruchomionego innego procesu git, po prostu usuń plik index.lock odpowiedniego projektu.

Touseef Murtaza
źródło
Pracowałem w środowisku mojego Maca.
Adam Hurwitz,
6

Właśnie miałem ten problem ... Gitbox był winny. Więc może miałeś uruchomione GUI, które powodowało problemy.

MyztikJenz
źródło
To nie był GUI, ale miałem osobny proces, który zapisywał do katalogu projektu. Nie mogłem tego rozgryźć i doprowadzało mnie to do szału.
asahi
Wygląda na to, że GitX lubi powodować ten problem.
Glutexo,
6 lat później był to dla mnie Atom
Milk
6

Dzieje się tak, gdy anulujesz ciągnięcie od początku w środku.

więc możesz ręcznie usunąć plik index.lock z katalogu .git.

rm -f ./.git/index.lock

cd do katalogu projektu i uruchom to polecenie.

Rahul Vivek
źródło
8
Biorąc pod uwagę, że problemem w pytaniu było to, że nie był w stanie usunąć pliku, dlaczego Twoim zdaniem próba usunięcia pliku powinna być rozwiązaniem?
skyking
+1 @ skyking. Usunięcie pliku jest oczywiste, problem polega na tym, że nie ma pliku do usunięcia, a problem występuje nadal.
Catsunami,
6
  1. Zamknij wszystkie okna, które potencjalnie wpływają na ten plik .git / index.lock
  2. Usuń plik .git / index.lock.
  3. Otwórz edytor wiersza poleceń i cd do lokalizacji plików git.

(Jeśli plik zostanie utworzony, po prostu z płyty CD do tej lokalizacji, problem leży w twoim edytorze. Zamknij edytor. Nie używaj tego edytora ponownie do tego zadania. Otwórz inny rodzaj edytora - Windows Power Shell lub po prostu cmd. Teraz możesz użyć poleceń git, aby kontynuować)

Steve Tomlin
źródło
5

Prawdopodobnie (tak się stało) polecenie ls mówi, że nie istnieje, ponieważ bieżący użytkownik nie ma uprawnień dostępu do tego katalogu lub pliku.

Usuń blokadę i upewnij się, że wykonujesz git z odpowiednim użytkownikiem , aby uniknąć problemów z uprawnieniami.

Jeśli jesteś w polu GNU / Linux z poleceniem sudo :

sudo rm ścieżka_projektu / .git / index.lock

caligari
źródło
W systemie Windows możesz sprawdzić, czy folder jest tylko do odczytu, klikając prawym przyciskiem myszy-> Właściwości-> Atrybuty.
Matt
Biorąc pod uwagę, że problemem w tym pytaniu było to, że plik nie istnieje, dlaczego Twoim zdaniem próba usunięcia pliku powinna być rozwiązaniem?
skyking
@skyking Problemy z uprawnieniami pokazują ten sam błąd. Rzeczywiście doszedłem do tego pytania, ponieważ tytuł.
Swoją
@caligari Niezupełnie. Problem uprawnień daje inną odpowiedź ls project_path/.git/index.lock.
skyking
5

del .git\index.lock pracował dla mnie.

Napotkałem ten problem podczas finalizowania transakcji w nowym oddziale oddziału master.

Do kasy łatwo zdarzyło się po usunięciu index.lockpliku.

Nikhil Shrivastav
źródło
4

Czasami Git tworzy plik blokady związany z repozytorium podczas wprowadzania zmian lub najprawdopodobniej podczas korzystania z podmodułów. Komunikat o błędzie pokaże ścieżkę do pliku blokady. Poprawka: wystarczy ręcznie przejść do ścieżki w terminalu i usunąć plik blokady za pomocą $ rm index.lock

To powinno pomóc.

Suhail Bhat
źródło
4

Miałem ten problem z SourceTree podczas przełączania gałęzi poprzez dwukrotne kliknięcie. Problem nie jest zbyt powszechny i Atlassian o tym wie, ale postanowili go nie naprawiać.

Na szczęście istnieje rozwiązanie. Zamiast podwójnego kliknięcia na gałąź, którą chcesz przełączyć, wystarczy kliknąć prawym przyciskiem myszy i wybrać „Do kasy [nazwa gałęzi]”. To powinno się teraz powieść.

znak
źródło
dzięki, kliknij prawym przyciskiem myszy> kasa działa jako alternatywa. komunikat o błędzie jest dość mylący, szczególnie gdy index.lock nie istnieje.
Ernest
4

Natknąłem się na ten sam scenariusz. Nawet nie wprowadziłem żadnych zmian w moim lokalnym kodzie. Właśnie edytowałem plik i przywracam go. Właśnie usunąłem poniższy plik z ukrytego folderu .git. Zadziałało!

ścieżka_projektu / .git / index.lock

Don D.
źródło
3

O ile nie zamierzałeś, aby root był właścicielem repozytorium, brzmi to tak, jakbyś przypadkowo uruchomił komendę Git jako root (może nawet początkowy klon / init). Jeśli chcesz to zrobić, będziesz musiał żyć z uruchomieniem wszystkich poleceń Git w repozytorium jako root. Jeśli nie, biegnij, sudo chown your-user[:your-group] -R .gitaby przejąć na własność, a następnie sprawdź, czy wszystko działa.

Cascabel
źródło
W moim przypadku zepsułem tryb plików i katalogów w środku .giti poprawiłem je: find .git -type f -exec chmod 644 {} \;a także find .git -type d -exec chmod 755 {} \;zepsułem tryby, przenosząc mój projekt git z jednego komputera na drugi
user3405291
W moim przypadku dodałem uprawnienia do zapisu do plików .gitsudo chmod g+w .git -R
Beatriz Fonseca,
2

Wielu klientów git pracujących w tym samym lokalnym repozytorium konkuruje o tę blokadę. Każdy klient powinien poczekać, aż druga strona zwolni zamek, aby być dobrym obywatelem. Wydaje nam się, że SourceTree lub MSVS wykonują pewne czynności konserwacyjne w tle, gdy działaliśmy z dużymi skryptami zatwierdzającymi.

Być może sam „git” powinien obsługiwać argument „--retriesWhenLocked 5” w celu obsługi ponownych prób. lub nawet domyślnie, gdy jest uruchamiany ręcznie.

Oto opakowanie programu PowerShell wokół gita o nazwie „gitr”, które ponawia próbę aż do zniknięcia pliku index.lock, przy użyciu domyślnych 5 prób, po 3 sekundy między nimi. Nigdy nie usuwa index.lock, zakładając, że użytkownik powinien interweniować. Został wyodrębniony z większego skryptu zatwierdzenia. Ma tylko minimalne testy z prostymi argumentami.

  • Skopiuj skrypt do C: \ bin i dodaj C: \ bin do $ PATH.
  • Z PS1> gitr --help
  • Od 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
}
Crokusek
źródło
2

Mam również to pytanie w systemie Windows 10.

kiedy próbuję del ./.git/index.lock, powiedział micannot remove 'index.lock': Device or resource busy

W końcu zrozumiałem powód:

komputer ma dwa procesy korzystania z git:

  • git bash
  • cmder

więc używam cmder.exe, aby git commitwystąpiły błędy.

więc rozwiązaniem jest użycie git bashlub Zakończ, a git bashnastępnie użyj cmder.exe

ihewro
źródło
1

Miałem ten sam błąd, ale problemem nie był plik blokady. Zamiast tego problem polegał na tym, że skopiowałem zawartość innego repozytorium git do tego repozytorium, w tym folder niewidoczny .git. Tak więc SourceTree był zdezorientowany, do którego repozytorium chciałem wystawić pliki (istnieje rozbieżność między repozytorium, które SourceTree myślało, że w nim jestem, a tym, w którym zawartość mojego osadzonego pliku .git dir powiedziała, że ​​powinienem być).

dmohr
źródło
1

Miałem ten problem z TortoiseGit z Cygwin na Windows. Nie udało mi się usunąć.

Odkryłem, że mam uruchomione 2 instancje TortoiseProc.exe. Zabiłem jednego z nich i zamknąłem wszystkie okna Eksploratora Windows, a następnie mogłem usunąć plik. Nie wiem, czy zabicie wystąpienia TortoiseProc.exe było rozwiązaniem, czy zamknięcie okna eksploratora Windows.

Samuel
źródło
1

Rozwiązaniem było dla mnie usunięcie pliku .index i umożliwienie Gitowi przebudowania innego.

CAR182
źródło
1

Nie miałem pliku inex.lock do usunięcia, ale dla mnie zadziałało usunięcie zaznaczenia Tylko do odczytu z okna Atrybuty okna dialogowego Właściwości folderu.

użytkownik3071434
źródło
1

Utworzyłem pusty plik index.lock, usunąłem go za pomocą polecenia systemu Windows

Gustavo Soares
źródło
1

Począwszy od gita 2.8.4 (czerwiec 2016 r.) , Nie powinno to już mieć miejsca.

Zobacz problem 755, który powinien również złagodzić problem ( zatwierdzenie 2db0641 ):

Upewnij się, że uchwyty plików tymczasowych nie są dziedziczone przez procesy potomne

Zapobiegaj dziedziczeniu dojścia do procesów potomnych index.lock.

VonC
źródło
1

W mojej aplikacji sourceTree nie jestem w stanie dokonać zatwierdzenia ani przejść do żadnego innego zatwierdzenia / bracha. Ten czas pokazuje błąd jak

fatal: Nie można stworzyć bla bla bla ..

Rozwiązuję to po prostu za pomocą folderu goto .git (w projekcie Explorer Dir). I usuń indeks ----- [typ pliku: plik LOCK]. Teraz odzyskam cały dostęp do źródła w drzewie źródłowym ..

upewnij się, że plik blokady indeksu .. załóżmy, że nie masz typu pliku, zmień ustawienia podglądu plików na komputerze. Uwaga: folder .git jest zwykle ukrytym typem folderu.

Karthikeyan Dheshnamoorthy
źródło
1

To, co dla mnie zrobiło, to:

git rebase --abort i uruchom ponownie bazę.

Jak wspomniał Andrew, kiedy to się stało, korzystałem również z PHPStorm. Nie musiałem go jednak zamykać.

Geert
źródło
1

Najpierw musisz przejść do określonego folderu projektu. Na przykład, jeśli nazwa projektu to Firstproject, najpierw przejdź do katalogu projektu .. następnie wpisz cd .git, a następnie po przejściu do folderu git wpisz del index.lock Po usunięcie pliku index.lock..Będziesz mógł zatwierdzić i wcisnąć jak poprzednio

Rezwan Ibnee Mohsin
źródło
1

W moim przypadku były to okna, które nie zostały całkowicie zamknięte.

Windows jest hibernowany, odmówiono zamontowania

Są szanse, że Windows naprawdę jest w stanie hibernacji. System Windows robi to automatycznie, gdy nakazuje się normalne zamknięcie. Korzyścią jest szybszy pozorny czas uruchamiania.

Aby zamknąć system Windows bez hibernacji, wydaj następujące polecenie w wierszu polecenia (w systemie Windows):

shutdown /s

Możesz także chcieć dołączyć /t 0do natychmiastowego zamknięcia.

Znalazłem fajny samouczek, aby skonfigurować program uruchamiający w tym celu: Jak wykonać pełne wyłączenie systemu Windows 8 bez wyłączania rozruchu hybrydowego.

Prostszym podejściem do faktycznego zamykania systemu Windows jest „ponowne uruchomienie” (zamiast „zamknięcie”), ale następnie przechwycenie procesu rozruchu i uruchomienie systemu Linux zamiast pozwalania mu na uruchomienie systemu Windows.

kredyt : nobar

Mukundhan
źródło
1

Może się to również zdarzyć, jeśli używasz alternatywnego klienta git z wiersza poleceń, takiego jak hub .

Używam hub jako aliasu zamiennika git od kilku lat, ale ostatnio napisałem skrypt bash, który robi w nim sporo git, i zacząłem mieć problem z blokowaniem indeksu.

Nie mogłem znaleźć poprawki, dopóki nie przypomniałem sobie, że działałem hub zamiast git. Usunąłem to i problem zniknął!

Brad Parks
źródło
0

Otrzymywanie błędu:

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.

Ale nie mogłem znaleźć (ani usunąć) tego pliku .git / index.lock.

W moim przypadku git-cola działała!

To oczywiście tworzy ten .git / index.lock co jakiś czas lub spowodowany przez rebase, który robiłem w linii poleceń i podczas którego otrzymałem ten błąd - więc git-cola oczywiście „zakłóca” działanie Git w linii poleceń (lub niektóre operacje Git CLI).

Rozwiązuje się to poprzez zamknięcie git-coli podczas git rebase z linii poleceń.

cslotty
źródło
0

Czasami inny klient Git może zakłócać działanie wielu zainstalowanych.

To znaczy. upewnij się, że w Menedżerze zadań lub Get-Processże TGitCacheTortoiseGit nie jest aktywny w tle.

MovGP0
źródło
0

Ostatnio miałem ten sam problem. Jeśli sprawdzisz cały komunikat o błędzie, oznacza to również, że istnieje proces korzystający z procesu git, który blokuje usunięcie pliku index.lock. Być może masz otwarte IDE, takie jak Visual Studio lub powiązane oprogramowanie, z którym git jest zintegrowany. Zamknij i spróbuj ponownie schować plik. Mam nadzieję, że to pomoże.

Borj
źródło