git index.lock 尝试提交时文件存在,但无法删除文件

Posted

技术标签:

【中文标题】git index.lock 尝试提交时文件存在,但无法删除文件【英文标题】:git index.lock File exists when I try to commit, but cannot delete the file 【发布时间】: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:您可能想接受答案吗?这将对未来的读者有所帮助。 Git - fatal: Unable to create '/path/my_project/.git/index.lock': File exists.的可能重复 @asahi:您可以发布您的编辑内容(这是解决方案)作为答案,然后接受。 (虽然比“重新启动机器”更通用的解决方案是另一个进程正在访问该目录;重新启动只是打破了试图找出哪个进程以及为什么的难解之结。:) 就我而言,它是我的 IDE。)无论如何,当人们找到自己的解决方案时,他们经常会回答自己的问题,而您就是这样做的。 【参考方案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 后仍然运行。这是我修复它的方法。

    按 Ctrl-Alt-Esc 或在 windows start 中键入“任务管理器”以启动任务管理器。 查找名为“git”、“git-lfs”等的所有进程,如下面的屏幕截图所示。右键单击并选择“结束进程”以杀死每个进程。 删除 .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】:
    关闭所有可能影响此 .git/index.lock 文件的窗口 删除 .git/index.lock 文件。 打开命令行编辑器并 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】:

在任务管理器中:

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

【讨论】:

【参考方案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 中禁用源代码控制提供程序,如下所示:

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

【讨论】:

即使我的 VS 甚至不应该访问这些存储库,但在使用 SourceTree 进行变基时,这仍然是问题。 谢谢,更新 3 仍然存在问题。 关闭 Visual Studio 也可以(删除 index.lock 文件。)

以上是关于git index.lock 尝试提交时文件存在,但无法删除文件的主要内容,如果未能解决你的问题,请参考以下文章

关于Git无法提交 index.lock的解决办法(学)

git —— 异常1,index.lock

git学习解决git提交代码时报错: Unable to create ‘XXX/.git/index.lock‘: File exists.

git提交过程中遇到的 index.lock 问题导致无法提交的解决方法

git学习解决git提交代码时报错: Unable to create ‘XXX/.git/index.lock‘: File exists.

git提交代码出现错误fatal: Unable to create '项目路径/.git/index.lock': File exists.