【问题标题】:git index.lock File exists when I try to commit, but cannot delete the filegit index.lock 尝试提交时文件存在,但无法删除文件
【发布时间】:2012-03-06 03:50:31
【问题描述】:

当我执行“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

编辑:似乎问题很可能是我正在运行的另一个进程,它正在(我不知道)写入项目目录。我重新启动了我的机器,然后提交没有问题。

【问题讨论】:

  • 这很可能是一个权限问题,Git 假设因为它无法创建它已经存在的文件。您是否尝试过获取目录的所有权或使用 sudo 执行命令?
  • 我认为您对访问 git repo 的另一个应用程序的解释是正确的。在 rebase 期间遇到了同样的问题。 Gitx 正在运行。一旦我退出它,git就可以正常工作。
  • @asahi:您可能想接受答案吗?这将对未来的读者有所帮助。
  • @asahi:您可以发布您的编辑内容(这是解决方案)作为答案,然后接受。 (虽然比“重新启动机器”更通用的解决方案是另一个进程正在访问该目录;重新启动只是打破了试图找出哪个进程以及为什么的难解之结。:) 就我而言,它是我的 IDE。)无论如何,当人们找到自己的解决方案时,他们经常会回答自己的问题,而您就是这样做的。

标签: git


【解决方案1】:

在我的情况下,只需转到 project_path/.git 并删除 index.lock 文件。尝试推送您的代码,它会起作用。

【讨论】:

  • 孤立的 index.lock 文件。通常,如果您有 index.lock 文件,那是因为 Git 进程正在运行或等待用户输入提示。但是,如果编辑进程终止或变得无响应,即使没有运行 Git 进程,index.lock 文件也可能被留下并保持存在。这个孤立的 index.lock 文件将阻止其他 Git 进程编辑存储库。
  • 删除孤立的 index.lock 文件。请注意,在 Windows 上,它只是没有锁定扩展的“索引”。如果您怀疑您有一个孤立的 index.lock 文件,请首先确认您没有运行任何 Git 进程。要检查长期运行的 Git 操作,请打开任务管理器,按名称排序,然后查找 git.exe 或其他与 Git 相关的进程。如果您看到任何内容,您可以等待它们完成并再次尝试 Git 操作。如果您没有任何 Git 进程在运行,您可以删除 index.lock 文件并再次尝试 Git 操作。
  • 以上 cmets 由 docs.microsoft.com 上的 Git 文档提供。
【解决方案2】:
  • 通过删除您尝试的存储库为我解决了问题 提交更改并从远程克隆最新版本(如果 使用远程 git 服务器)。
  • 如果是本地复制目录中的数据 并初始化一个新的 git 存储库。

【讨论】:

    【解决方案3】:

    您的代码是否位于 Dropbox 正在同步的目录中?尝试暂停 Dropbox。

    我一直遇到同样的情况,但是一旦我暂停了 Dropbox(界面让您可以选择暂停 30 分钟、1 小时……),它就再也没有发生过。

    【讨论】:

    • 这解决了我的问题。
    【解决方案4】:

    今天遇到了这个问题,SourceTree 产生了几个 git 进程,即使在关闭 SourceTree 后仍然运行。这是我修复它的方法。

    1. 按 Ctrl-Alt-Esc 或在 windows start 中键入“任务管理器”以启动任务管理器。
    2. 查找名为“git”、“git-lfs”等的所有进程,如下面的屏幕截图所示。右键单击并选择“结束进程”以杀死每个进程。
    3. 删除 .git/index.lock 文件。

    【讨论】:

      【解决方案5】:

      如果您使用备用命令行 git 客户端(例如 hub),也会发生这种情况。

      几年来,我一直在使用 hub 作为 git 的别名替代品,但最近编写了一个 bash 脚本,在其中执行了一堆 git 工作,并开始遇到这个索引锁定问题。

      直到我想起我运行的是集线器而不是 git,我才找到修复程序。我删除了它,问题就消失了!

      【讨论】:

        【解决方案6】:

        在我的情况下,它是 windows,没有完全关闭。

        Windows 已休眠,拒绝挂载

        Windows 可能确实处于休眠状态。当您告诉它正常关机时,Windows 会自动执行此操作。好处是您可以获得更快的启动时间。

        要在不休眠的情况下关闭 Windows,请在命令提示符处(在 Windows 中)发出以下命令:

        shutdown /s
        

        您可能还需要包含 /t 0 以立即关闭。

        我找到了一个很好的教程来为此设置启动器:如何在不禁用混合启动的情况下在 Windows 8 中完全关闭。

        实际关闭 Windows 的更简单方法是“重新启动”(而不是“关闭”),然后拦截启动过程并启动 Linux,而不是让它启动 Windows。

        信用nobar

        【讨论】:

          【解决方案7】:
          1. 关闭所有可能影响此 .git/index.lock 文件的窗口
          2. 删除 .git/index.lock 文件。
          3. 打开命令行编辑器并 cd 到 git 文件所在的位置。

          ( 如果文件被创建,只是从 cd 到那个位置,那么问题出在你的编辑器上。关闭你的编辑器。不要再使用这个编辑器来完成这个任务。打开一个不同类型的编辑器 - windows power shell 或者只是cmd. 现在可以使用git命令继续)

          【讨论】:

            【解决方案8】:

            就我而言,没有要删除的 index.lock 文件。在用更漂亮的格式格式化后,我试图提交 109 个文件。当时提交较少的文件是最终“解决”问题的原因。

            【讨论】:

              【解决方案9】:

              这可能是一个旧回复,但我希望这对下一个需要此解决方案的人更有用。

              在 linux/unix/gitbash/cygwin 上,试试

              rm -f .git/index.lock

              在 Windows 命令提示符下,尝试:

              del .git\index.lock

              【讨论】:

              • 我看到有时锁定文件会被自动删除。任何线索为什么有时需要手动删除此文件?
              • 我没有 index.lock,怎么办? :(
              • 鉴于问题中的问题是他无法删除文件,您为什么认为尝试删除文件应该是解决方案?
              • 对我来说,关闭和打开 SourceTree 解决了这个问题...暂时我想。
              • @skyking 在原始问题中有一个错误说fatal: Unable to create 'project_path/.git/index.lock': File exists.,它说“文件存在”,删除它是简单的解决方案。如果文件甚至不在原始问题中,为什么我会建议删除它?
              【解决方案10】:

              首先,您必须导航到项目的特定文件夹.. 就像如果您的项目名称是 Firstproject 那么首先进入项目的目录.. 然后输入 cd .git 然后导航到 git 文件夹类型 del index.lock 删除文件 index.lock.. 之后就可以像以前一样提交和推送了

              【讨论】:

                【解决方案11】:

                我也遇到过同样的情况。我什至没有对我的本地代码进行任何更改。我刚刚编辑了一个文件并将其还原。我只是删除了隐藏的 .git 文件夹中的以下文件。成功了!

                project_path/.git/index.lock

                【讨论】:

                  【解决方案12】:

                  试试

                  rm -f ./.git/index.lock
                  

                  如果没有其他 git 进程在运行,则只需删除相应项目的 index.lock 文件即可。

                  【讨论】:

                  • 在我的 mac 环境下工作。
                  【解决方案13】:

                  del .git\index.lock 为我工作。

                  我在从 master 分支签出新分支时遇到了这个问题。

                  删除index.lock文件后很容易结帐。

                  【讨论】:

                    【解决方案14】:

                    它为我做了什么:

                    git rebase --abort 并重新启动变基。

                    正如Andrew 提到的那样,发生这种情况时我也在使用 PHPStorm。不过不必关闭它。

                    【讨论】:

                      【解决方案15】:

                      对于 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
                      

                      【讨论】:

                      • 无法处理参数,因为参数名称'f'不明确。
                      • 谢谢,@MikePalmice,我已更新为 -Force。似乎他们改变了 API
                      • 谢谢,这对我来说非常适合 taskkill 然后我做了有效的力量:) 谢谢人。 @AndreiEpure
                      【解决方案16】:

                      在任务管理器中:

                      1. 开发所有流程
                      2. 杀死所有 git 进程
                      3. 删除锁定的文件

                      【讨论】:

                        【解决方案17】:

                        我在 Windows 10 中也有这个问题。

                        当我尝试 del ./.git/index.lock 时,它告诉我 cannot remove 'index.lock': Device or resource busy

                        终于知道原因了:

                        电脑有两个进程使用git:

                        • git bash
                        • 管理员

                        所以我用cmder.exe来git commit会出现错误。

                        所以解决方案是使用git bash 或终止git bash 然后使用cmder.exe

                        【讨论】:

                          【解决方案18】:

                          我最近遇到了同样的问题。如果您要检查整个错误消息,它还会说有一些进程正在使用 git 进程阻止您删除 index.lock。您可能已经打开了 IDE,例如 Visual Studio 或 git 集成到的相关软件。关闭它并尝试重新存储您的文件。希望对您有所帮助。

                          【讨论】:

                            【解决方案19】:

                            在同一个本地存储库上工作的多个 git 客户端竞争该锁。每个客户端都应该等到对方释放锁才能成为一个好公民。对我们来说,SourceTree 或 MSVS 似乎在我们运行大型提交脚本时在后台进行一些维护。

                            也许“git”本身应该支持一个“--retriesWhenLocked 5”参数来支持重试。甚至在手动运行时默认为这个。

                            这是一个围绕 git 的 PowerShell 包装器,名为“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
                            }
                            

                            【讨论】:

                              【解决方案20】:

                              我在通过双击切换分支时遇到了 SourceTree 的问题。这个问题不是很常见,Atlassian knows about it 但他们决定不修复它。

                              幸运的是,有一个解决方案。而不是双击要切换的分支,只需右键单击并选择“结帐[分支名称]”。现在应该成功了。

                              【讨论】:

                              • 谢谢,右键单击 > 结帐可作为替代方案。该错误消息非常具有误导性,尤其是当 index.lock 不存在时。
                              【解决方案21】:

                              在我的 sourceTree 应用程序中,我无法提交或切换到任何其他提交/分支。那个时间显示像

                              这样的错误

                              致命:无法创建等等等等。

                              我只是通过转到 .git 文件夹(在项目资源管理器目录中)来解决这个问题。并删除索引 ----- [文件类型:LOCK 文件]。现在我恢复了 sourceTree 中的所有访问权限..

                              请确保索引锁定文件..假设您没有获取文件类型,请更改计算机中的文件视图设置。注意:.git 文件夹通常是隐藏类型的文件夹。

                              【讨论】:

                                【解决方案22】:

                                git 2.8.4 (June 2016)开始,这不应该再发生了。

                                请参阅issue 755,这也应该可以缓解问题 (commit 2db0641):

                                确保临时文件句柄不被子进程继承

                                防止子进程继承index.lock的句柄。

                                【讨论】:

                                  【解决方案23】:

                                  当安装了多个 Git 客户端时,有时另一个 Git 客户端可能会干扰。

                                  即。使用任务管理器或Get-Process 确保来自 TortoiseGit 的TGitCache 在后台未处于活动状态。

                                  【讨论】:

                                    【解决方案24】:

                                    当您在中间取消从原点拉动时,就会发生这种情况。

                                    所以你可以做的是从你的 .git 目录中手动删除 index.lock 文件。

                                    rm -f ./.git/index.lock
                                    

                                    cd 进入你的项目目录并运行这个命令。

                                    【讨论】:

                                    • 鉴于问题中的问题是他无法删除文件,您为什么认为尝试删除文件应该是解决方案?
                                    • +1 @skyking。删除文件很明显,问题是没有文件要删除,问题依旧。
                                    【解决方案25】:

                                    如果您使用的是 Windows 版 GIT BASH:-

                                    运行这两个命令 1. cd .git 2.rm index.lock

                                    【讨论】:

                                    • 鉴于问题中的问题是他无法删除文件,您为什么认为尝试删除文件应该是解决方案?
                                    【解决方案26】:

                                    我创建了一个空的 index.lock 文件,使用 windows 命令删除了它

                                    【讨论】:

                                      【解决方案27】:

                                      我没有要删除的 inex.lock 文件,但对我有用的是从文件夹属性对话框的属性窗口中删除只读检查。

                                      【讨论】:

                                        【解决方案28】:

                                        得到错误:

                                        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,或者是由我在命令行上执行的 rebase 引起的,在此期间我收到了该错误 - 所以 git-cola 显然“扰乱”了命令行运行 Git(或一些 Git CLI 操作)。

                                        这可以通过在命令行 git rebase 期间关闭 git-cola 来解决。

                                        【讨论】:

                                          【解决方案29】:

                                          我的解决方案是删除 .index 文件并允许 Git 重建另一个。

                                          【讨论】:

                                            【解决方案30】:

                                            在运行 Visual Studio 2015 RC (v4.6.00057) 和 SourceTree (v1.6.14.0) 的 Windows 平台上也会出现此错误。

                                            解决方案: 假设您想使用源代码树作为源代码管理器,只需在 Visual Studio 中禁用源代码控制提供程序,如下所示:

                                            1. 转到:工具 > 选项 > 源代码管理
                                            2. 选择当前源代码控制插件为:无

                                            【讨论】:

                                            • 即使我的 VS 甚至不应该访问这些存储库,但在使用 SourceTree 进行变基时,这仍然是问题。
                                            • 谢谢,更新 3 仍然存在问题。
                                            • 关闭 Visual Studio 也可以(删除 index.lock 文件。)
                                            猜你喜欢
                                            • 1970-01-01
                                            • 2012-08-04
                                            • 1970-01-01
                                            • 2013-05-12
                                            • 2012-12-09
                                            • 2011-12-13
                                            • 2011-01-29
                                            • 2020-07-18
                                            • 2017-09-18
                                            相关资源
                                            最近更新 更多