当我做'git commit'时,我得到以下内容:

无法创建“project_path/.git/index”。lock `:文件已存在。

然而,当我执行ls project_path/.git/index。锁定,表示文件不存在。你觉得我该怎么做?我还注意到project_path/。git由root拥有,不确定这是否与我遇到的问题有关。

Git版本为1.7.5.4

编辑:看起来问题很可能是我正在运行的另一个进程,那就是向项目目录写入(我不知道)。我重新启动了我的电脑,然后我就没有问题了。


除非你真的打算让根用户拥有你的repo,否则这听起来像是你意外地以根用户身份运行了Git命令(甚至可能是初始的clone/init)。如果您打算这样做,那么您将不得不以根用户身份在repo中运行所有Git命令。如果没有,运行sudo chown your-user[:your-group] -R .git来获得它的所有权,然后看看事情是否正常。


刚刚遇到了这个问题…Gitbox是错的。也许您的GUI正在运行,导致了问题。


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

在linux/unix/gitbash/cygwin上尝试

Rm -f .git/index.lock

在Windows命令提示符中尝试:

.git \ index.lock的


检查git是否仍在运行(ps -ef | grep git) 如果不存在,请移除该文件 如果是,请先关闭git进程。


可能(我遇到过这种情况),ls命令说它不存在,因为当前用户没有访问该目录或文件的权限。

移除锁并确保使用正确的用户执行git,以避免权限问题。

如果你在GNU/Linux系统下使用sudo命令:

执行rm project_path/.git/index.lock


有时Git会在你做任何更改或者使用子模块时创建一个与你的repo相关的锁文件。 错误消息将显示锁定文件的路径。 修复:只需手动进入路径在终端和删除锁定文件 $ rm index.lock

这应该会有所帮助。


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


我在Windows上的TortoiseGit和Cygwin有这个问题。我不能删除。/.git/index。我尝试了Cygwin和命令提示符,它说该文件正在被另一个进程使用。

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


在运行Visual Studio 2015 RC (v4.6.00057)并结合SourceTree (v1.6.14.0)的Windows平台上,也会给出此错误。

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

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


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


获取错误:

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。锁文件。

在我的情况下,吉特可乐正在运行!

它显然创建了。git/index。每隔一段时间就会锁一次,或者是由于我在命令行上所做的更改而导致的,在此期间我收到了这个错误-所以Git -cola显然会“干扰”Git的命令行运行(或一些Git CLI操作)。

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


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


我创建了一个空索引。锁定文件,使用Windows命令删除


如果你正在使用GIT BASH For Windows:-

运行以下两个命令 1. cd . 2. rm index.lock


这是当你取消从中间的原点开始拉时发生的。

你可以手动删除索引。锁定文件从你的。git目录。

rm -f ./.git/index.lock

CD到您的项目目录并运行此命令。


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

Ie。通过任务管理器或Get-Process确保TortoiseGit中的TGitCache在后台不活跃。


从git 2.8.4(2016年6月)开始,这种情况不应该再发生了。

参见问题755,这也应该缓解这个问题(commit 2db0641):

确保临时文件句柄没有被子进程继承 防止子进程继承index.lock的句柄。


在我的sourceTree应用程序中,我不能做提交或切换到任何其他提交/分支。时间显示误差

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

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

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


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

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


Windows:

从以管理员身份打开的powershell控制台尝试

> rm -Force ./.git/index.lock

如果这不起作用,您必须杀死所有git.exe进程

> taskkill /F /IM git.exe PID为20448的进程“git.exe”已被终止。 PID为11312的进程“git.exe”已被终止。 PID为23868的进程“git.exe”已被终止。 PID为27496的进程“git.exe”已被终止。 PID为33480的进程“git.exe”已被终止。 PID为28036的进程“git.exe”已被终止。 > rm -Force ./.git/index.lock


关闭所有可能影响这个.git/index的窗口。锁文件 删除.git/index。锁文件。 打开命令行编辑器,cd到git文件的位置。

(如果创建文件只是简单地从cd到那个位置,那么问题出在编辑器上。关闭编辑器。不要在此任务中再次使用此编辑器。打开另一种编辑器- windows power shell或简单的cmd。现在你可以使用git命令继续)


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

当我尝试del ./.git/index。锁,它告诉我不能删除索引。lock':设备或资源繁忙

我终于明白了原因:

计算机有两个进程使用git:

吉特巴什 CMDER

所以我使用cder .exe来git提交它会发生错误。

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


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

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

下面是一个名为“gitr”的PowerShell包装器,它可以重新尝试直到创建索引。锁定消失,默认5次,每次3秒。它从不删除索引。锁定,假设用户应该干预。它是从一个较大的提交脚本中提取的。它只使用简单的参数进行最少的测试。

复制脚本到C:\bin,并将C:\bin添加到$PATH。 来自PS1> gitr -救命 从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
}

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


在任务管理器中:

开发所有流程 关闭所有git进程 删除锁定文件


对我有帮助的是:

Git rebase -中止并重新启动rebase。

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


del . \指数。洛克为我工作。

当我从主分支签出一个新分支时,我遇到了这个问题。

删除索引后很容易发生签出。锁文件。


try

rm -f ./.git/index.lock

如果没有其他git进程正在运行,那么只需删除索引。各自项目的锁定文件。


我也遇到过同样的情况。我甚至没有对本地代码做任何更改。我刚刚编辑了一个文件并恢复了它。我只是在隐藏的。git文件夹中删除了下面的文件。它工作!

project_path / . / index.lock


首先,你必须导航到你的项目的特定文件夹。 比如,如果你的项目名称是Firstproject,那么首先进入项目的目录。 然后输入CD .git 然后在导航到git文件夹后,键入del index.lock 在删除文件index.lock..之后,你将能够像以前一样提交和推送


在我的案例中,没有索引。锁定要删除的文件。我试图在用pretty格式化后提交109个文件。提交更少的文件最终“解决”了这个问题。


在我的例子中,它是窗户,而不是完全关闭。

窗口已休眠,拒绝挂载

Windows很有可能真的处于休眠状态。当你告诉Windows正常关机时,它会自动关机。这样做的好处是可以获得更快的启动时间。

在没有hybernating的情况下关闭Windows,在命令提示符下发出以下命令(在Windows中):

shutdown /s

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

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

真正关闭Windows的更简单的方法是“重新启动”(而不是“关闭”),但随后拦截引导过程并引导Linux,而不是让它引导Windows。

信贷:nobar


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

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

直到我想起来我运行的是hub而不是git,我才找到解决方案。我把它去掉了,问题就解决了!


今天遇到了这个问题,SourceTree生成了几个git进程,即使在关闭SourceTree后,这些git进程仍在运行。以下是我的解决方法。

按Ctrl-Alt-Esc或在windows start中输入“任务管理器”启动任务管理器。 寻找所有名为“git”,“git-lfs”的进程,如下面的截图所示。右键单击并选择“End process”以杀死每个进程。 删除.git/index。锁文件。


你的代码是否在Dropbox正在同步的目录中?试着暂停Dropbox。

我一直得到同样的情况,但一旦我暂停Dropbox(界面给你选择暂停30分钟,1小时,…),它再也没有发生过。


通过删除你正在尝试的回购,我解决了这个问题 提交更改并从远程复制最新版本(如果 使用远程git服务器)。 如果是本地,则从目录中复制数据 并初始化一个新的git存储库。


在我的例子中,只需转到project_path/。Git并删除索引。锁文件。试着推动你的代码,它会工作的。


对我来说,罪魁祸首是windows安全,它阻止了git.exe运行,你可以检查屏幕右下角的通知选项卡。

消息将如下所示

Virus and threat protection 
unauthorized changes blocked
controlled folder access blocked git.exe from running


如果您正在使用Visual Studio(如Visual Studio 2019),则在尝试使用Git提交更改时会出现此错误。

当您没有与Team Server连接时,可能会发生这种情况。为了纠正它,

在Visual Studio中,从Team菜单中选择命令Manage Connections。 在解决方案资源管理器中查看—您应该看到团队资源管理器-连接。 通过在列出的树中单击连接到您正在处理的项目。(如果你之前参与过这个项目,这一步就有效了。) 连接后,再次尝试提交。


我所做的

删除项目。Git \索引文件手动 在终端git重置 synup项目


在我的例子中,我随机得到a

fatal: Не удалось создать «/home/mingun/project/.git/index.lock»: Файл существует.

Похоже, что другой процесс git запущен в этом репозитории,
например редактор открыт из «git commit». Пожалуйста, убедитесь,
что все процессы были завершены и потом попробуйте снова.
Если это не поможет, то возможно процесс git был ранее завершен
с ошибкой в этом репозитории: 
удалите файл вручную для продолжени

消息,当我做一个rebase,我很确定没有其他git进程。至少一个没有看到他们中的任何一个,当我检查他们刚刚失败的rebase命令。当然,每次我都立即检查并看到/home/mingun/project/.git/index. .锁文件不存在。

通常情况下,当我每次尝试进行重基时,都会遇到这个错误,在几次重基提交后,进程会失败。更糟糕的是,在大多数情况下不可能继续rebase:

$ git status
интерактивное перемещение в процессе; над e55e03330e3
Last commands done (21 commands done):
   pick 1a39bd4740d <skipped>
   pick f1906baf94b <skipped>
  (смотрите дополнительно в файле .git/rebase-merge/done)
Next commands to do (13 remaining commands):
   pick 98db21878ed <skipped>
   pick 30488ef5a5a <skipped>
  (используйте «git rebase --edit-todo», чтобы просмотреть или изменить их)
Вы сейчас перемещаете ветку «master» над «e55e03330e3».
  (все конфликты разрешены: запустите «git rebase --continue»)

Изменения, которые будут включены в коммит:
    новый файл:    <skipped>
    изменено:      <skipped>

$ git rebase --continue
fatal: не удалось прочитать файл журнала «.git/rebase-merge/message»: Нет такого файла или каталога
error: не удалось закоммитить проиндексированные изменения.
$

有时,如果我在两次尝试之间等待几秒钟,git rebase(实际上是git svn rebase)命令会成功完成。但通常你必须等待并尝试10次或更多。重构todo的时间越长,它以错误结束的可能性就越大。

当我试图用英文消息重现这个错误,并在错误跟踪器中发布结果时,我惊讶地发现,使用LANG=C总是能解决问题!我认为这是一场意外非常可疑。

我认为这是一个git错误的另一个原因是这些错误最近才开始发生(可能是一年前),尽管我的git工作模式已经有一段时间没有改变了。

所以,如果你遇到了和我一样的问题,试着在你的命令前加上LANG=C:

$ LANG=C git svn rebase

这可能是因为当你试图拉代码并突然停止进程。

简单的方法:

Rm -f ./.git/index.lock 在master/main分支的git状态之后 还能看到很多红色的文件。运行git reset——hard origin/master删除所有本地更改,使其与origin/master类似。