Git index.lock Файл существует, когда я пытаюсь выполнить, но не могу удалить файл

Когда я делаю '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: Похоже, что проблема, скорее всего, была другим процессом, который я выполнял, который писал (без ведома меня) в каталог проекта. Я перезапустил свою машину, и тогда у меня не было никаких проблем.

Ответ 1

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

В linux/unix/gitbash/cygwin попробуйте

rm -f .git/index.lock

В командной строке Windows попробуйте:

del .git\index.lock

Ответ 2

Для Windows:

  • С консоли PowerShell, открытой как администратор, попробуйте
> rm -Force ./.git/index.lock
  • Если это не работает, вы должны убить все процессы 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

Ответ 3

На платформе Windows, использующей Visual Studio 2015 RC (v4.6.00057) в сочетании с SourceTree (v1.6.14.0), также будет указана эта ошибка.

Решение: Предполагая, что вы хотите использовать исходное дерево в качестве менеджера исходного кода, просто отключите поставщика управления источником внутри Visual Studio следующим образом:

  • Перейдите в меню "Инструменты" > "Параметры" > "Управление источником"
  • Выберите текущий модуль управления источником: None

Ответ 4

  • проверьте, работает ли git (ps -ef | grep git)
  • если нет, удалите заблокированный файл
  • если да, сначала запустите процесс git.

Ответ 5

пытаться

rm -f ./.git/index.lock

если у вас нет другого запущенного процесса git, просто удалите файл index.lock соответствующего проекта.

Ответ 6

Это происходит, когда вы делаете отмену вытягивания из источника посередине.

поэтому вы можете вручную удалить файл index.lock из вашего каталога .git.

rm -f ./.git/index.lock

cd в каталог проекта и запустите эту команду.

Ответ 7

Просто эта проблема... Gitbox был виноват. Возможно, у вас был запуск графического интерфейса, что вызывало проблемы.

Ответ 8

Возможно (это случилось со мной), команда ls говорит, что этого не существует, потому что у текущего пользователя нет разрешений для доступа к этому каталогу или файлу.

Удалите блокировку и убедитесь, что вы выполняете git с нужным пользователем, чтобы избежать проблем с разрешением.

Если вы находитесь в поле GNU/Linux с командой sudo:

sudo rm project_path/.git/index.lock

Ответ 9

  1. Закройте все окна, которые могут повлиять на этот файл .git/index.lock
  2. Удалите файл .git/index.lock.
  3. Откройте редактор командной строки и перейдите в папку с файлами git.

(Если файл создается просто с компакт-диска в это место, то проблема заключается в вашем редакторе. Закройте редактор. Не используйте этот редактор снова для этой задачи. Откройте редактор другого типа - оболочку Windows Power или просто cmd. Теперь вы можете использовать команды git для продолжения)

Ответ 10

Иногда Git создает файл блокировки, связанный с вашим репо, когда вы вносите какие-либо изменения или, скорее всего, когда используете вспомогательные модули. Сообщение об ошибке покажет вам путь к файлу блокировки. Исправить: просто вручную перейдите к пути в терминале и удалите файл блокировки с помощью $ rm index.lock

Это должно помочь.

Ответ 11

del.git\index.lock работал на меня.

Я столкнулся с этой проблемой при оформлении заказа на новую ветку из главной ветки.

Оформить заказ легко после удаления файла index.lock.

Ответ 12

Если вы на самом деле не предназначались для root для вашего репо, это звучит так, будто вы случайно запускали команду Git как root (возможно, даже начальный клон /init ). Если вы хотели это сделать, вам придется жить с запуском всех команд Git в репо с правами root. Если вы этого не сделали, запустите sudo chown your-user[:your-group] -R .git, чтобы получить право собственности на него, а затем посмотрите, все ли работает.

Ответ 13

У меня возникла проблема с SourceTree при переключении ветки, дважды щелкнув по ней. Проблема не очень распространена, и Atlassian знает об этом, но они решили не исправлять ее.

К счастью, есть решение. Вместо двойного щелчка по ветке, которую вы хотите переключить, просто щелкните правой кнопкой мыши и выберите "Checkout [название ветки]". Теперь это должно преуспеть.

Ответ 14

Я сталкивался с тем же сценарием. Я даже не сделал никаких изменений в моем локальном коде. Я только что отредактировал файл и восстановил его. Я просто удалил приведенный ниже файл в скрытой папке .git. Это сработало!

project_path/.git/index.lock

Ответ 15

У меня также есть этот вопрос в Windows 10.

когда я пытаюсь del ./.git/index.lock, он сказал мне cannot remove 'index.lock': Device or resource busy

Наконец-то я получил причину:

у компьютера есть два процесса для использования git:

  • git bash
  • cmder

поэтому я использую cmder.exe для git commit, это приведет к ошибкам.

поэтому решение использует git bash или Terminate the git bash, а затем используйте cmder.exe

Ответ 16

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

Ответ 17

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

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

Ответ 18

Решение для меня состояло в том, чтобы удалить .index файл и разрешить Git перестраивать другой.

Ответ 19

У меня не было файла inex.lock для удаления, но для меня работала удаление проверки только для чтения из окна "Атрибуты" диалогового окна "Свойства папки".

Ответ 20

Я создал пустой файл index.lock, удалив его с помощью команды windows

Ответ 21

Запуск git 2.8.4 (июнь 2016 г.), этого больше не должно быть.

См. вопрос 755, который также должен устранить проблему (commit 2db0641):

Убедитесь, что временные файлы не наследуются дочерними процессами

Предотвратить дочерние процессы от наследования дескриптора до index.lock.

Ответ 22

В моем приложении sourceTree я не могу выполнить фиксацию или переключиться на любой другой commit/brach. Это время показывает ошибку, например

фатальный: невозможно создать бла-бла-бла..

Я просто разрешаю это с помощью папки goto.git(в Project Explorer Dir). И удалите индекс ----- [тип файла: LOCK файл]. Теперь я возвращаю весь доступ в sourceTree..

пожалуйста, убедитесь, что файл блокировки индекса. Предположим, вы не получили тип файла, измените параметры просмотра файлов на компьютере. Примечание: папка .git обычно является скрытым типом папки.

Ответ 23

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

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

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

  • Скопируйте script в 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
}

Ответ 24

Что для меня это было:

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

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

Ответ 25

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

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 (или некоторые операции CLI).

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

Ответ 26

Иногда другой клиент Git может вмешиваться при наличии нескольких установленных.

Т.е. убедитесь, что с Диспетчером задач или Get-Process, что TGitCache из TortoiseGit не активен в фоновом режиме.

Ответ 27

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

Ответ 28

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

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

Ответ 29

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

Ответ 30

В большинстве ответов говорится о запуске сценария "rm index.lock", но в этот раз у меня это не получилось. Терминал продолжал возвращаться

rm: невозможно удалить. /.git/index.lock: устройство или ресурс заняты

Похоже, это проблема Sourcetree, и я наконец-то нашел решение:

В Sourcetree: откройте Инструменты> Параметры> Git и переключитесь на встроенный Git. Если вы попытаетесь подтолкнуть его, это не удастся (по крайней мере для меня).

Вернитесь снова и переключитесь обратно на System Git, и теперь, когда вы нажимаете, он действительно работает (по крайней мере, для меня :))