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

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

419630 次浏览

除非你真的打算让根用户拥有你的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命令提示符中尝试:

del .git\index.lock

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

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

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

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

执行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平台上,也会给出此错误。

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

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

我的解决方案是删除.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 < / p >

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

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

rm -f ./.git/index.lock

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

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

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

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

参见发行755,这也应该缓解问题(提交2 db0641):

确保临时文件句柄没有被子进程继承

防止子进程继承句柄到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
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
  1. 关闭所有可能影响这个.git/index的窗口。锁文件
  2. 删除.git/index。锁文件。
  3. 打开命令行编辑器,cd到git文件的位置。

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

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

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

我终于明白了原因:

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

  • git bash
  • cmd

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

所以解决方案是使用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的相关软件。关闭它,并尝试重新存储您的文件。希望能有所帮助。

在任务管理器中:

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

对我有帮助的是:

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

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

del .git\index.lock对我有用。

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

删除index.lock文件后很容易发生签出。

试一试

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作为git的别名替代品,但最近写了一个bash脚本,在其中执行了大量git工作,并开始出现索引锁问题。

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

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

  1. 按Ctrl-Alt-Esc或输入“任务管理器”;在windows中启动任务管理器。
  2. 寻找所有名为“&;git&;”,“&;git-lfs"”的进程,如下面的截图所示。右击并选择“结束流程”;杀了他们每个人。
  3. 删除.git/index。锁文件。

enter image description here

你的代码是否在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连接时,可能会发生这种情况。为了纠正它,

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

我所做的

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

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

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


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

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

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