git index.lock Файл существует, когда я пытаюсь зафиксировать, но не могу удалить файл - PullRequest
166 голосов
/ 14 февраля 2012

Когда я делаю 'git commit', я получаю следующее:

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

Однако, когда я делаю ls project_path/.git/index.lock, он говорит, что файл не существует. Есть мысли о том, что мне делать? Я также заметил, что project_path / .git принадлежит root, но не уверен, что это как-то связано с проблемой, с которой я сталкиваюсь.

git версия 1.7.5.4

edit: Кажется, что проблема, скорее всего, была в другом процессе, который я выполнял, который писал (без моего ведома) в каталог проекта. Я перезапустил свою машину, и у меня не возникло проблем с фиксацией.

Ответы [ 31 ]

1 голос
/ 05 мая 2015

У меня была эта проблема с TortoiseGit с Cygwin на Windows.Я не смог удалить remove ./.git/index.lock даже с правами администратора, я пробовал и Cygwin, и командную строку, в которой говорилось, что файл используется другим процессом.

Я обнаружил, что у меня запущено 2 экземпляра TortoiseProc.exe.Я убил один из них и закрыл все окна Windows Explorer, а затем смог удалить файл.Я не знаю, было ли решение проблемы уничтожения экземпляра TortoiseProc.exe или закрытие окон проводника Windows.

1 голос
/ 18 сентября 2014

У меня была точно такая же ошибка, но проблема была не в файле блокировки. Вместо этого проблема заключалась в том, что я скопировал в это хранилище содержимое другого репозитория git, включая невидимую папку .git. Итак, SourceTree был озадачен тем, в какое хранилище я хотел разместить файлы (было несоответствие между тем, в котором я находился, и тем, в котором содержалось содержимое моего встроенного .git dir).

1 голос
/ 17 мая 2017

Несколько клиентов git, работающих в одном локальном репозитории, борются за эту блокировку.Каждый клиент должен подождать, пока другая сторона не снимет блокировку, чтобы стать хорошим гражданином.Для нас SourceTree или MSVS, кажется, выполняют некоторую поддержку в фоновом режиме, пока мы выполняем большие скрипты фиксации.

Возможно, сам git должен поддерживать аргумент --retriesWhenLocked 5 дляподдержка повторов. или даже значение по умолчанию при запуске вручную.

Вот оболочка PowerShell вокруг git с именем "gitr", которая повторяет попытки до исчезновения index.lock, используя 5 попыток по умолчанию, по 3 секунды между каждым.Он никогда не удаляет index.lock, предполагая, что пользователь должен вмешаться.Он был извлечен из более крупного скрипта коммита.Он имеет минимальное тестирование с простыми аргументами.

  • Скопируйте скрипт в C: \ bin и добавьте C: \ bin в $ PATH.
  • Из PS1> gitr --help
  • Из 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
}
1 голос
/ 23 марта 2018

Что это для меня сделало:

git rebase --abort и перезапустите ребаз.

Как Эндрю упомянул, что я также использовал PHPStorm, когда это произошло. Не надо было его закрывать.

0 голосов
/ 11 февраля 2018

В диспетчере задач:

  1. разработать весь процесс
  2. Убить всех мерзавцев
  3. Удалить заблокированный файл
0 голосов
/ 02 августа 2017

У меня недавно была такая же проблема.Если вы проверите все сообщение об ошибке, это также говорит о том, что есть некоторый процесс, который использует процесс git, который блокирует вас от удаления index.lock.Вы можете открыть IDE, например Visual Studio или связанное с ним программное обеспечение, в которое интегрирован git.Закройте его и попробуйте заново сохранить ваш файл.Надеюсь, это поможет.

0 голосов
/ 29 сентября 2018

Сначала вы должны перейти к определенной папке вашего проекта .. Например, если имя вашего проекта Firstproject, то сначала перейдите в каталог проекта. затем введите cd .git затем после перехода в папку git наберите del index.lock После удаления файла index.lock .. Вы сможете зафиксировать и нажать как раньше

0 голосов
/ 15 декабря 2015

Если вы используете GIT BASH для Windows: -

Запустите эти две команды 1. cd .git 2. rm index.lock

0 голосов
/ 23 октября 2015

Получение ошибки:

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.

Но я не смог найти (или удалить) этот файл .git / index.lock.

В моем случае, git-cola работала!

Очевидно, что он создает этот файл .git / index.lock время от времени или по причине перебазирования, которое я выполнял в командной строке и во время которого я получил эту ошибку - так что git-cola явно «мешает» командной строке запуск Git (или некоторых операций Git CLI).

Это решается закрытием git-cola во время командной строки git rebase.

0 голосов
/ 25 марта 2019

В моем случае не было файла index.lock для удаления. Я пытался зафиксировать 109 файлов после форматирования с красивее. Фиксация меньшего количества файлов в то время - вот что, наконец, «решило» проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...