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

197

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

Asahi
источник
3
Вполне может быть проблема с разрешениями, когда Git предполагает, что, поскольку он не может создать файл, он уже существует. Вы пытались стать владельцем каталога или выполнить команду с помощью sudo?
1
Я думаю, что ваше объяснение другого приложения, обращающегося к git-репо, правильное. Была такая же проблема во время перебазирования. Гиткс бежал. Как только я ушел, мерзавец работал нормально.
The Who
2
@asahi: Может быть, вы хотите принять ответ? Это поможет будущим читателям.
MERose
3
@asahi: Вы можете опубликовать содержание вашего редактирования (которое было решением) в качестве ответа, а затем принять это. (Хотя более общее решение, чем «перезагрузка компьютера», заключается в том, что другой процесс обращался к каталогу; перезапуск просто разрывает узел Гордиана, пытаясь выяснить, какой и почему. :) В моем случае это была моя IDE.) В любом случае, люди часто отвечают на свои вопросы, когда находят свои решения, что вы и сделали.
Уилсон Ф

Ответы:

330

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

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

rm -f .git/index.lock

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

del .git\index.lock

Райан С
источник
1
Я вижу, что иногда файл блокировки удаляется автоматически. Любая подсказка, почему этот файл иногда нужно удалять вручную?
Nrj
У меня нет index.lock, что делать? :(
Алекс С
56
Учитывая, что проблема в вопросе заключалась в том, что он не смог удалить файл, почему вы думаете, что попытка удаления файла должна быть решением?
скайкинг
4
Для меня закрытие и открытие SourceTree решили проблему ... Временно я полагаю.
Андрей
1
@skyking в исходном вопросе есть ошибка, которая говорит fatal: Unable to create 'project_path/.git/index.lock': File exists., что «Файл существует», и удаление его будет простым решением. Зачем мне предлагать удалить файл, если его нет даже в исходном вопросе?
Райан С
40

Для 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
Андрей Эпуре
источник
1
Параметр не может быть обработан, потому что имя параметра 'f' неоднозначно.
3pitt
спасибо, @MikePalmice, я обновился до -Force. Кажется, они изменили API
Андрей Epure
20

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

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

  1. Перейдите: Инструменты> Параметры> Контроль источника
  2. Выберите Плагин управления источником тока как: Нет
WLCyPHlSpC
источник
Несмотря на то, что моя VS не должна даже иметь доступ к этим репозиториям, в любом случае это была проблема при перебазировании с SourceTree.
Kajetan Abt
Спасибо, проблема все еще существует с обновлением 3.
Elger Mensonides
Закрытие Visual Studio также работает (удалил файл index.lock.)
misterbee
10
  1. проверьте, работает ли git (ps -ef | grep git)
  2. если нет, удалите заблокированный файл
  3. если да, сначала убейте git-процесс.
Даниэль YC Лин
источник
9

пытаться

rm -f ./.git/index.lock

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

Тусиф Муртаза
источник
Работал в среде моего Mac.
Адам Гурвиц
6

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

MyztikJenz
источник
Это был не графический интерфейс, но у меня был отдельный процесс, который писал в каталог проекта. Я не мог понять это, и это сводило меня с ума.
Асахи
Похоже, GitX тоже любит вызывать эту проблему.
Glutexo
6 лет спустя, это был Атом для меня
Молоко
6

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

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

rm -f ./.git/index.lock

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

Рахул Вивек
источник
8
Учитывая, что проблема в вопросе заключалась в том, что он не смог удалить файл, почему вы думаете, что попытка удаления файла должна быть решением?
скайкинг
+1 @кинг. Удаление файла очевидно, проблема в том, что нет файла для удаления, и проблема сохраняется.
Catsunami
6
  1. Закройте все окна, которые могут повлиять на этот файл .git / index.lock
  2. Удалите файл .git / index.lock.
  3. Откройте редактор командной строки и перейдите к расположению ваших файлов git.

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

Стив Томлин
источник
5

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

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

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

sudo rm project_path / .git / index.lock

Калигари
источник
В Windows вы можете проверить, доступна ли папка только для чтения, щелкнув правой кнопкой мыши -> Свойства -> Атрибуты.
Мэтт
Учитывая, что проблема в вопросе заключалась в том, что файл не существовал, почему вы думаете, что попытка удаления файла должна быть решением?
скайкинг
@skyking Проблемы с разрешением показывают ту же ошибку. Действительно, я пришел к этому вопросу, потому что название. Я написал свой ответ как одно из возможных решений, и некоторые голоса подтверждают, что это происходит и с другими людьми;)
caligari
@caligari Не совсем. Проблема с разрешением дает другой ответ ls project_path/.git/index.lock.
скайкинг
5

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

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

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

Нихил Шривастав
источник
4

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

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

Сухай Бхат
источник
4

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

К счастью, есть решение. Вместо двойного щелчка по ветви, которую вы хотите переключить, просто щелкните правой кнопкой мыши и выберите «Оформить заказ [название ветви]». Это должно преуспеть сейчас.

отметка
источник
спасибо, щелкните правой кнопкой мыши> оформить заказ работает как альтернатива. сообщение об ошибке вводит в заблуждение, особенно когда index.lock не существует.
Эрнест
4

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

project_path / .git / index.lock

Дон Д
источник
3

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

Cascabel
источник
В моем случае я испортил режим файлов и каталогов внутри, .gitи я исправил их с помощью: find .git -type f -exec chmod 644 {} \;а также find .git -type d -exec chmod 755 {} \;я испортил режимы при переносе моего проекта git с одного компьютера на другой
user3405291
В моем случае я добавил разрешение на запись в файлы .gitsudo chmod g+w .git -R
Беатрис Фонсека,
2

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

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

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

  • Скопируйте скрипт в C: \ bin и добавьте C: \ bin в $ PATH.
  • Из PS1> Гитр - Помощь
  • Из 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
источник
2

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

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

Я наконец получил причину:

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

  • мерзавец
  • cmder

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

так что решение использовать git bashили git bashпрекратить то использовать cmder.exe

ihewro
источник
1

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

dmohr
источник
1

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

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

Самуил
источник
1

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

CAR182
источник
1

У меня не было файла, не подлежащего удалению, но для меня работало удаление проверки «Только для чтения» из окна «Атрибуты» диалогового окна «Свойства папки».

user3071434
источник
1

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

Густаво Соареш
источник
1

Начиная с git 2.8.4 (июнь 2016 г.) , этого больше не должно происходить.

Смотрите проблему 755, которая также должна облегчить проблему ( commit 2db0641 ):

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

Запретить дочерним процессам наследовать дескриптор index.lock.

VonC
источник
1

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

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

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

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

Картикеян Дешнамурти
источник
1

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

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

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

Герт
источник
1

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

Резван Ибни Мохсин
источник
1

В моем случае это были окна, не закрытые полностью.

Windows находится в режиме гибернации, отказался монтировать

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

Чтобы завершить работу Windows без использования гибернации, введите в командной строке следующее (в Windows):

shutdown /s

Вы также можете включить /t 0для немедленного выключения.

Я нашел хороший учебник по настройке запуска для этого: Как выполнить полное выключение в Windows 8 без отключения гибридной загрузки.

Более простой подход к фактическому завершению работы Windows состоит в том, чтобы «перезагрузить» (а не «выключить»), но затем перехватить процесс загрузки и загрузить Linux вместо того, чтобы позволить ему загружать Windows.

кредит : нобар

Mukundhan
источник
1

Это также может произойти, если вы используете альтернативный git-клиент из командной строки, например, hub .

Я использовал хаб в качестве альтернативной замены для git в течение нескольких лет, но недавно написал bash-скрипт, который выполняет в нем кучу git, и начал получать эту проблему блокировки индекса.

Я не мог найти починку, пока не вспомнил, что вместо git я запускаю hub. Я удалил это, и проблема ушла!

Брэд Паркс
источник
0

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

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 / index.lock время от времени или по причине перебазирования, которое я делал в командной строке и во время которого я получил эту ошибку - так что git-cola явно «мешает» запуску Git из командной строки (или некоторые операции Git CLI).

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

cslotty
источник
0

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

То есть. убедитесь, что с помощью диспетчера задач или Get-Processчто TGitCacheTortoiseGit не работает в фоновом режиме.

MovGP0
источник
0

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

Бордж
источник