git index.lock File exists when I try to commit, but cannot delete the file
当我做'git commit'时,我得到以下内容:
但是,当我执行
git版本是1.7.5.4
编辑:似乎问题很可能是我运行的另一个进程,即向项目目录编写(我不知道)。 我重新启动了我的机器然后我没有任何问题。
这可能是一个旧的回复,但我希望这对下一个需要此解决方案的人更有用。
在linux / unix / gitbash / cygwin上,试试吧
在Windows命令提示符下,尝试:
对于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中禁用源代码控制提供程序,如下所示:
尝试
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
它应该有所帮助。
(如果文件是创建的,只需从cd进入该位置,那么问题就在于你的编辑器。关闭你的编辑器。不要再使用这个编辑器完成这个任务了。打开一个不同类型的编辑器 - windows power shell或者只是cmd。现在你可以使用git命令继续)
我在从主分支机构结账时遇到了这个问题。
删除
通过双击切换分支时,我遇到了SourceTree的这个问题。问题不是很常见,Atlassian知道这个问题,但他们决定不修复它。
幸运的是,有一个解决方案。不要双击要切换的分支,只需右键单击并选择"Checkout [branch name]"。它现在应该成功。
我遇到了同样的情况。 我甚至没有对我的本地代码进行任何更改。 我刚刚编辑了一个文件并将其还原。 我只是在隐藏的.git文件夹中删除了下面的文件。 有效!
project_path/.git/index.lock
除非你真的打算让root拥有你的repo,这听起来像你不小心以root身份运行了一个Git命令(甚至可能是初始的clone / init)。如果您打算这样做,那么您将不得不忍受以root身份运行repo中的所有Git命令。如果没有,请运行
我在Windows 10中也有这个问题。
当我尝试del
我终于得到了理由:
电脑有两个使用git的过程:
- git bash
- cmder
所以我使用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 } |
对我来说是什么:
正如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集成到的相关软件。关闭它并尝试重新存储您的文件。希望能帮助到你。
在任务管理器中:
首先,您必须导航到项目的特定文件夹..
就像你的项目名称是Firstproject一样,然后首先进入项目的目录..
然后键入cd .git
导航到git文件夹后输入del index.lock
删除文件index.lock ..您将能够像以前一样提交和推送
有时安装多个Git客户端可能会干扰。
IE浏览器。确保使用任务管理器或
如果您使用的是GIT BASH For Windows: -
运行这两个命令
1. cd .git
2. rm index.lock