Git重命名index.lock为index失败。

75

使用GitHub Windows客户端,我执行了同步以将远程更改拉到本地机器上,但在完成同步之前,我的磁盘空间用尽了,同步失败了。现在我似乎有一堆本地更改,实际上是从源代码库中拉取的更改。我尝试运行git pull但收到以下错误信息:

C:\Users\Tom\SourceLog [master +4 ~26 -0 !]> git pull
Updating b3a86e1..5afd74f
error: Your local changes to the following files would be overwritten by merge:
        SourceLog.Interface/IChangedFile.cs
        SourceLog.Interface/ILogEntry.cs
        ...
Please, commit your changes or stash them before you can merge.
error: The following untracked working tree files would be overwritten by merge:
        Lib/MSBuildExtensionPack/4.0.6.0/Ionic.Zip.dll
        Lib/MSBuildExtensionPack/4.0.6.0/MSBuild.ExtensionPack.dll
        ...
Aborting

现在我试图丢弃本地的更改,但是我遇到了以下错误:

C:\Users\Tom\SourceLog [master +4 ~26 -0 !]> git checkout -- .
Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) y
Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) n
fatal: unable to write new index file

我该如何清理这个?(在开始同步之前,我没有进行任何本地更改。)

更新

似乎无法重置头部。

C:\Users\Tom\SourceLog [master +4 ~0 -0 !]> git reset head
Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) y
Rename from '.git/index.lock' to '.git/index' failed. Should I try again? (y/n) n
error: Could not write new index file.
fatal: Could not reset index file to revision 'head'.

2
你在这段时间里释放了一些空间吗?这可能是重命名失败的原因之一。如果这不是重命名失败的原因,你可以尝试删除.git/index(或将其移动到其他地方,以防万一),然后再次尝试git reset --hard HEAD - twalberg
是的,我清理了几个G的空间。尝试移动索引文件时发现有一个进程锁定了它。 - Tom Hunter
1
删除 .git/index 对我有用。谢谢。 它只是重新创建了它。 - ramnz
一旦GitHub for Windows使用git 2.8.4(2016年6月),您就不应再看到该错误。请参见我的报告 - VonC
26个回答

41

在我的情况下,这是由于在管理员和非管理员命令提示符中同时使用相同的Git存储库所致。 当最后一次git pull是从管理员命令提示符中进行时,它创建了index,然后非管理员命令提示符没有足够的权限来修改它。

我的解决方案是重新创建index(同时保持工作树不变):

del .git\index
del .git\index.lock
git reset --mixed head

4
通过删除.git/index和.git/index.lock两个文件,解决了我的问题。 - Matt
2
嗨,通常情况下不需要指定 --mixed,因为这已经是标准了:https://git-scm.com/docs/git-reset#git-reset---mixed - A. Blesius
3
@A.Blesius 是的,--mixed 是默认选项,但我明确指出是因为 reset 命令可能看起来有些吓人。 - Dimagog
1
@Dimagog非常感谢你的提示。在我的情况下:Visual Studio以管理员模式运行,GitKraken以非管理员模式运行,因此我收到了GitKraken中的消息,原因是权限!谢谢! - Lightning3
完成这个操作后,我能够执行 git add .,但是在执行 git commit 时又遇到了错误。 - AlwaysLearning

38

看起来以下进程锁定了.git\index文件:

ssh-agent.exe
C:\Users\Tom\AppData\Local\GitHub\PortableGit_8810fd5c2c79c73adcc73fd0825f3b32fdb816e7\bin\ssh-agent.exe

我杀掉了进程并运行了git reset HEAD,现在看起来我回到正常状态了。


7
我猜可能不需要执行git reset HEAD。即使没有执行这个命令,对我来说也能正常工作! - BrainStone
同意,我认为只有 ssh-agent.exe 进程锁定了索引文件。除了杀掉它之外,不需要做任何其他事情。 - Rob
6
我也遇到了同样的问题,导致锁定的程序是Visual Studio Code(或者与它相关的程序),当我关闭它后,问题得到解决。 - Olov
对我来说,问题出在explorer.exe上,尽管我没有打开实际的文件夹或任何子文件夹。关闭所有资源管理器窗口就足以解决我的问题。 - Heinrich Ulbricht

35
在我的情况下,我不得不关闭用code .命令在WSL Ubuntu终端中打开的VS Code

3
确切地说,发生了和我一样的事情。但是每次我需要提交 git 时都必须关闭 vscode,这仍然很麻烦。 - Laurence

13

这可能是一个真正的问题,尝试以管理员身份而不是用户身份运行您的Terminal。 对我有用。


2
这是我的问题。.git所在的位置在一个受保护的文件夹中。 - Daniel Butler

7
当我尝试执行git checkout -b my-branch时,出现了Rename from '。git / index.lock' ...的提示信息。
对于我来说,解决方法是以管理员身份运行命令行。
具体来说,我使用了非管理员权限的优秀应用程序cmder,这导致重命名消息出现。通过以管理员身份运行cmder,然后再次执行检出命令,就可以正常工作了。

4

Git 2.10 (Q3 2016, 4年后)应该会改善Windows上的情况。

请参见提交05d1ed6 (2016年8月23日),作者是Ben Wijen (Ben)

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

当索引被锁定且子进程继承了该锁的句柄,而父进程想要在子进程退出之前删除该锁时,在Windows上会出现问题:它不会起作用,因为如果一个进程持有文件的句柄,则无法删除文件。

症状:

Rename from 'xxx/.git/index.lock' to 'xxx/.git/index' failed.
Should I try again? (y/n)

使用 bInheritHandles==FALSE 生成子进程将不起作用,因为不会继承任何文件句柄,甚至不会继承 STARTUPINFO 中的 hStdXxx 句柄(stdin/stdout/stderr)。
每个文件都使用 O_NOINHERIT 打开也行不通,例如 git-upload-pack 需要继承文件句柄。
这使我们只有一条出路:使用带有 O_NOINHERIT 标志的临时文件。 然而,此标志仅适用于 Windows。
对于我们的目的,它相当于 O_CLOEXEC(Windows 上不存在),因此 让我们只使用带有 O_CLOEXEC 标志的临时文件, 并将该标志映射到 Windows 上的 O_NOINHERIT

2
为了放弃本地更改,请执行以下操作:
git reset HEAD

那么请检出您的旧提交,删除新的提交,然后再次拉取。
git checkout "hashOld"
git branch -d "hashNew"
git pull

或者在这里阅读,应该可以解决问题:https://dev59.com/LnA75IYBdhLWcg3wSm64 - James McDonnell
1
谢谢@JamesMcDonnell。不幸的是,看起来我也做不到这个...(请看我的更新)。 - Tom Hunter
你可以删除你的 .git 文件夹,创建一个新仓库并进行拉取。 - James McDonnell

2

对我而言,出现了这个错误:

将 'D:/dev/repo/.git/refs/remotes/origin/my-branch.lock' 重命名为 'D:/dev/repo/.git/refs/remotes/origin/my-branch' 失败。是否要重试?(y/n)

重命名 "my-branch" 文件后重试,"my-branch.lock" 成功重命名,但不确定是否正确,但是有效。主分支和我的分支中的本地更改都得到了保留。


1

重新启动您的源代码编辑器;杀死进程可能有效,但不礼貌。


1

我在类似的问题上回答过这个问题。可能对其他人有帮助,这里引用相同的内容:

"如果任何 Windows 用户遇到此问题:

我遇到了同样的问题,权限也没有解决,因为我已经分配了所有权限。删除 index.lock 也没有帮助。

我尝试使用 WSL,它显示了这个错误:

Another git process seems to be running in this repository.

基于此,我退出了 VS Code 运行的每个进程(这是我正在使用的 IDE),一切恢复正常。

注意:仅关闭 VS Code 没有帮助,必须从任务管理器中结束所有进程。

在更大的层面上,尝试通过您使用 git 的所有进程来结束它们。对我来说,只是 VS Code."

原始答案:https://stackoverflow.com/a/67615831/13404308


在我的情况下,关闭VSCode解决了这个问题。 - Günter Zöchbauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接