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

时间:2012-02-14 19:02:27

标签: git

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

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

37 个答案:

答案 0 :(得分:268)

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

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

rm -f .git/index.lock

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

del .git\index.lock

答案 1 :(得分:29)

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

答案 2 :(得分:19)

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

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

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

答案 3 :(得分:9)

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

答案 4 :(得分:8)

尝试

rm -f ./.git/index.lock

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

答案 5 :(得分:8)

当您取消从中间位置拉动时,会发生这种情况。

所以您可以手动删除.git目录中的index.lock文件。

rm -f ./.git/index.lock

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

答案 6 :(得分:5)

刚出现这个问题...... Gitbox有错。所以也许你有一个运行的GUI导致了问题。

答案 7 :(得分:5)

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

取消锁定并确保您使用合适的用户执行git,以避免权限问题。

如果你在使用 sudo 命令的GNU / Linux盒子中:

  

sudo rm project_path / .git / index.lock

答案 8 :(得分:4)

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

应该有所帮助。

答案 9 :(得分:4)

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

我在从主分支机构检出新分支时遇到了这个问题。

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

答案 10 :(得分:4)

好的,我已经解决了这个问题。

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

答案 11 :(得分:3)

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

  

project_path / .git / index.lock

答案 12 :(得分:3)

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

答案 13 :(得分:2)

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

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

答案 14 :(得分:2)

我在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

答案 15 :(得分:1)

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

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

  

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

     

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

答案 16 :(得分:1)

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

几年来,我一直在使用hub作为git的别名替代,但是最近写了一个bash脚本,在其中执行了很多git工作,并开始出现此索引锁定问题。

直到我记得我正在运行hub而不是git之前,我找不到修复程序。我删除了,问题就消失了!

答案 17 :(得分:1)

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

答案 18 :(得分:1)

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

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

答案 19 :(得分:1)

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

答案 20 :(得分:1)

对我来说是什么:

var columnSeries = this.series[0], lineSeries = this.series[1], firstPoint = columnSeries.points[0], lastPoint = columnSeries.points[columnSeries.points.length - 1], clipRect = this.renderer.clipRect(firstPoint.shapeArgs.x, 0, lastPoint.plotX, 9999); lineSeries.graph.clip(clipRect); 并重新启动rebase。

正如Andrew提到的那样,当发生这种情况时我也在使用PHPStorm。虽然没有关闭它。

答案 21 :(得分:1)

在同一本地存储库上工作的多个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

    #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
}

答案 22 :(得分:1)

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

答案 23 :(得分:1)

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

答案 24 :(得分:1)

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

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

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

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

答案 25 :(得分: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-cola正在运行!

它显然每隔一段时间创建一次.git / index.lock,或者是由我在命令行上执行的rebase引起的,在此期间我收到了该错误 - 所以git-cola显然会“干扰”命令行运行Git(或一些Git CLI操作)。

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

答案 26 :(得分:0)

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

答案 27 :(得分:0)

在任务经理中:

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

答案 28 :(得分:0)

首先,您必须导航到项目的特定文件夹。 就像您的项目名称是Firstproject一样,则首先转到项目目录。 然后输入cd .git 然后导航到git文件夹后,键入del index.lock 删除文件index.lock ..之后,您将可以像以前一样提交并推送

答案 29 :(得分:0)

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

答案 30 :(得分:0)

在我的情况下,它是Windows,而不是完全关闭。

Windows处于休眠状态,拒绝挂载

有可能Windows确实处于休眠状态。当您告诉它正常关闭时,Windows会自动执行此操作。这样做的好处是可以缩短表观启动时间。

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

shutdown /s

您可能还希望包含/t 0以便立即关闭。

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

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

信用nobar

答案 31 :(得分:0)

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

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

答案 32 :(得分:0)

今天遇到了这个问题,其中SourceTree产生了几个git进程,这些进程甚至在关闭SourceTree之后仍然保持运行。这是我的解决方法。

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

enter image description here

答案 33 :(得分:0)

  • 问题已通过删除您尝试的存储库为我解决 提交更改并从远程克隆最新版本(如果 使用远程 git 服务器)。
  • 如果是本地复制目录中的数据 并初始化一个新的 git 存储库。

答案 34 :(得分:0)

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

答案 35 :(得分:-1)

当我不小心在主文件夹中初始化git repo时出现了此错误,因此我转到该文件夹​​并运行rm -rf .git/,这可以删除引起问题的.git文件。

答案 36 :(得分:-2)

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

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