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


git index.lock File exists when I try to commit, but cannot delete the file

当我做'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

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


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

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

rm -f .git/index.lock

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

del .git\index.lock


对于Windows:

  • 从以管理员身份打开的powershell控制台中,尝试
1
> rm -Force ./.git/index.lock
  • 如果这不起作用,则必须终止所有git.exe进程
1
2
3
4
5
6
7
8
> 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


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

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

  • 转到:工具>选项>源代码管理
  • 选择Current source control插件为:None

  • 检查git是否仍在运行(ps -ef | grep git)
  • 如果没有,请删除锁定的文件
  • 如果是的话,首先杀死git进程。

  • 尝试

    1
    rm -f ./.git/index.lock

    如果你没有运行其他git进程,那么只需删除相应项目的index.lock文件。


    当您取消从中间的原点取消时会发生这种情况。

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

    1
    rm -f ./.git/index.lock

    cd进入项目目录并运行此命令。


    刚刚遇到这个问题...... Gitbox有问题。所以也许你有一个GUI运行导致问题。


    可能(它发生在我身上),ls命令说它不存在,因为当前用户没有权限到达该目录或文件。

    删除锁定并确保您正在与正确的用户执行git以避免权限问题。

    如果你在带有sudo命令的GNU / Linux盒子里:

    sudo rm project_path/.git/index.lock


    有时Git会在您进行任何更改时创建与您的repo关联的锁定文件,或者很可能在您使用子模块时创建。
    错误消息将显示锁定文件的路径。
    修复:只需手动转到终端中的路径并删除锁定文件
    $ rm index.lock

    它应该有所帮助。


  • 关闭可能影响此.git / index.lock文件的每个窗口
  • 删除.git / index.lock文件。
  • 打开命令行编辑器并cd到git文件的位置。
  • (如果文件是创建的,只需从cd进入该位置,那么问题就在于你的编辑器。关闭你的编辑器。不要再使用这个编辑器完成这个任务了。打开一个不同类型的编辑器 - windows power shell或者只是cmd。现在你可以使用git命令继续)


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

    我在从主分支机构结账时遇到了这个问题。

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


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

    幸运的是,有一个解决方案。不要双击要切换的分支,只需右键单击并选择"Checkout [branch name]"。它现在应该成功。


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

    project_path/.git/index.lock


    除非你真的打算让root拥有你的repo,这听起来像你不小心以root身份运行了一个Git命令(甚至可能是初始的clone / init)。如果您打算这样做,那么您将不得不忍受以root身份运行repo中的所有Git命令。如果没有,请运行sudo chown your-user[:your-group] -R .git来获取它的所有权,然后查看是否有效。


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

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

    我终于得到了理由:

    电脑有两个使用git的过程:

    • git bash
    • cmder

    所以我使用cmder.exe来git commit它会发生错误。

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


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


    我有完全相同的错误,但问题不是锁定文件。相反,问题是我已将另一个git repo的内容复制到此repo中,包括.git不可见文件夹。因此,SourceTree对于我想要将文件存储到哪个仓库感到困惑(源代码SourceTree认为我所处的仓库之间存在不匹配,而我的嵌入式.git目录中的内容表示我应该在其中)。


    我在Windows上使用Cygwin的TortoiseGit遇到了这个问题。即使使用管理权限,我也无法删除remove ./.git/index.lock,我尝试了Cygwin和命令提示符,它说该文件正由另一个进程使用。

    我发现我有2个TortoiseProc.exe实例正在运行。我杀死了其中一个,关闭了所有的Windows资源管理器窗口,然后就可以删除该文件了。我不知道是否杀死TortoiseProc.exe的实例是解决方案或关闭Windows资源管理器窗口。


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


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


    启动git 2。8。4(2016年6月),这不应该再发生了。

    问题755也应该缓解这个问题(提交2db0641):

    Make sure temporary file handles are not inherited by child processes

    Prevent child processes from inheriting a handle to index.lock.


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

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

    我只需通过goto .git文件夹解决此问题(在项目资源管理器目录中)。并删除索引----- [文件类型:LOCK文件]。现在我在sourceTree中取回所有访问权限..

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


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

    也许'git'本身应该支持'--retriesWhenLocked 5'参数来支持重试。或者甚至在手动运行时默认为此。

    这是一个名为"gitr"的git的PowerShell包装器,它会重试,直到index.lock消失,使用默认的5次尝试,每次之间3秒。它永远不会删除index.lock,假设用户应该介入。它是从较大的提交脚本中提取的。它只有简单参数的最小测试。

    • 将脚本复制到C: bin并将C: bin添加到$ PATH。
    • 从PS1> gitr --help
    • 来自DOS%> powershell gitr --help

    gitr.ps1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
        #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
    }

    对我来说是什么:

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

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


    得到错误:

    1
    2
    3
    4
    5
    6
    7
    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来解决的。


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


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


    在任务管理器中:

  • 发展所有过程
  • 杀死所有的git进程
  • 删除锁定的文件

  • 首先,您必须导航到项目的特定文件夹..
    就像你的项目名称是Firstproject一样,然后首先进入项目的目录..
    然后键入cd .git
    导航到git文件夹后输入del index.lock
    删除文件index.lock ..您将能够像以前一样提交和推送


    有时安装多个Git客户端可能会干扰。

    IE浏览器。确保使用任务管理器或Get-Process来自TortoiseGit的TGitCache在后台不活动。


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

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