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

Posted

技术标签:

【中文标题】Git 从 index.lock 重命名为 index 失败【英文标题】:Git rename from index.lock to index failed 【发布时间】:2012-11-18 02:18:16 【问题描述】:

使用 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'.

【问题讨论】:

您是否在此期间释放了一些空间?这将是重命名失败的原因之一。如果这不是重命名失败的原因,您可以尝试删除.git/index(或将其移至其他位置,以防万一),然后再次尝试git reset --hard HEAD 是的,我清理了一些演出空间。尝试移动索引文件并发现一个进程已锁定它.. delete .git/index 为我工作。谢谢。它只是重新创建它。 一旦 GitHub for Windows 将使用 git 2.8.4(2016 年 6 月),您应该不会再看到该错误。 See my report here) 【参考方案1】:

我尝试了很多建议。有时,提交会成功,但随后会返回错误。最后,暂停 Dropbox 同步似乎成功了!我不知道 Dropbox 同步如何导致此错误持续超过几分钟(同步我的 24K .git/index 所需的时间)。

【讨论】:

【参考方案2】:

就我而言,我以管理员身份完成了git pull,而我的普通用户不再拥有足够的权限。

我的解决方案是将所有权重置为我的普通用户。

    右键单击.git,然后打开属性。 在安全标签上,点击高级。 在高级安全设置中,点击所有者旁边的更改 strong>(即使它已经正确)。 在选择用户中,选择普通用户,然后点击确定。 在 Security 标签的 Owner 下,您现在有一个 Replace子容器和对象的所有者复选框 - 选中此项并点击确定

【讨论】:

【参考方案3】:

我更改项目权限

然后,我退出代码编辑器

【讨论】:

【参考方案4】:

我将整个项目复制(在 Windows 10 中)到一个新文件夹。从那里推到原点(当时没有发出索引问题)。然后我又回到了项目目录,问题就出现在这里。删除 .git 目录。重新初始化(git init)。添加到索引 (git add . )。从远程来源获取并合并。仅此而已。

【讨论】:

【参考方案5】:

我已经回答了一个类似的问题。也可以帮助其他人,在这里引用相同的内容:

“如果任何 Windows 用户偶然发现:

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

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

另一个 git 进程似乎正在此存储库中运行。

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

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

更重要的是,尝试结束您使用 git 的所有进程。对我来说,这只是 VS Code。”

原答案:https://***.com/a/67615831/13404308

【讨论】:

在我的情况下关闭 VSCode 修复了它。【参考方案6】:

我遇到了这个问题,想为未来的搜索者发布答案。仅 Windows 确认。当我的 git 存储库位于需要提升权限的目录下时,我得到了这个,并且我从一个无权写入该文件夹的进程(cmd.exe)运行 git,因此它无法清除锁定。

答案很简单,以管理员身份运行。

【讨论】:

【参考方案7】:

这可能是一个真正的问题,请尝试以管理员身份而不是用户身份运行您的终端。为我工作

【讨论】:

这是我的问题。 .git 所在的位置在受保护的文件夹中【参考方案8】:

就我而言,我必须关闭 VS 代码,我从 WSL Ubuntu 终端使用code . 打开它。

【讨论】:

正是发生在我身上的事情。但是我必须关闭 vscode 才能进行 git commit 仍然很痛苦。【参考方案9】:

这是在防病毒或 OS Defender(例如 Windows Defender)运行时引起的。 解决方案:关闭杀毒软件几分钟让你添加、提交和推送。 打开防病毒软件。 它会起作用的。

【讨论】:

尝试突出显示关键字并明确格式,这将有助于为其他人找到答案【参考方案10】:

git init 解决了我的问题。我遇到了以下问题。

Rename from '.git/objects/pack/pack-XXXXX.pack' to '.git/objects/pack/old-XXXXX.pack' failed. Should I try again? (y/n)

【讨论】:

【参考方案11】:

对我来说是这个错误:

Rename from 'D:/dev/repo/.git/refs/remotes/origin/my-branch.lock' to 'D:/dev/repo/.git/refs/remotes/origin/my-branch' failed. Should I try again? (y/n)

重命名“my-branch”文件,重试,“my-branch.lock”重命名成功,不确定是否正确,但有效。保留了 master 和 my-branch 中的本地更改。

【讨论】:

【参考方案12】:

当我使用 master 重新设置我的分支时,我似乎遇到了问题。我的解决方案是关闭所有正在打开的解决方案,并将我的分支硬重置为原点并再次变基。

【讨论】:

【参考方案13】:

我正在使用 Tortoise Git。我刚刚打开了一个新的 Windows 资源管理器,它解决了这个问题。 (对于命令行 Git 可能只是打开一个新的 shell)。

【讨论】:

【参考方案14】:

在我的情况下,这是由于在管理员和非管理员命令提示符下使用相同的 Git 存储库造成的。当最后一个git pull来自admin cmd时,index是由它创建的,然后非admin cmd没有足够的权限修改它。

我的解决方案是重新创建index(同时保持工作树完好无损):

del .git\index
git reset --mixed head

【讨论】:

通过删除 .git/index 和 .git/index.lock 为我工作 嗨,通常不需要指定--mixed,因为它已经是标准:git-scm.com/docs/git-reset#git-reset---mixed @A.Blesius 是的,--mixed 是默认设置,但我明确表示,因为reset 命令看起来很吓人。 @Dimagog 非常感谢您的提示。在我的情况下:Visual Studio 处于管理员模式,GitKraken 处于非管理员模式,所以我在 GitKraken 中收到了消息,因为权限!谢谢! 执行此操作后,我可以git add .,但在执行git commit时再次出现错误【参考方案15】:

我在尝试执行时看到了这个Rename from '.git/index.lock'... 消息

git checkout -b my-branch

对我来说,解决方法是将命令行作为 admin 运行。

具体来说,我以非管理员身份使用出色的cmder 应用程序,导致出现重命名消息。以管理员身份运行cmder,然后再次执行结帐,一切正常。

【讨论】:

【参考方案16】:

我删除了indexindex.lock(在.git 文件夹中)并运行git checkout . 以撤消更改并解决,但如果我想提交更改,我会在@987654326 之后运行git add -A @

【讨论】:

【参考方案17】:

在存储在 Google Drive 文件夹中的项目中运行 git reset HEAD 时,我连续多次遇到此错误,但几分钟后问题消失了。

【讨论】:

啊,也在使用 Google Drive。似乎在一两秒后消失。 对于后代,Dropbox 中的版本冲突也可能导致此问题,但它不会自行消失。在任何一种情况下,只需要删除 .git/index 的“冲突副本”。【参考方案18】:

要么杀死锁定文件的进程,要么如果它是一个新的 repo,删除 .git 文件夹 rm -rf .git 并从 git init 重新开始

【讨论】:

【参考方案19】:

Git 2.10(2016 年第三季度,4 年后)应该会改善 Windows 上的情况

见commit 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 (stdin/stdout/stderr) 中的 hStdXxx 句柄。

使用O_NOINHERIT 打开每个文件也不起作用,例如git-upload-pack 需要继承的文件句柄。

这给我们留下了唯一的出路:使用O_NOINHERIT 标志创建临时文件。但是,此标志是特定于 Windows 的。 对于我们的目的,它相当于O_CLOEXEC(它不存在于 Windows),所以let's just open temporary files with the O_CLOEXEC flag 和 map that flag to O_NOINHERIT on Windows.

【讨论】:

【参考方案20】:

我在使用 Git 时遇到了类似的问题。我的解决方案是通过Windows资源管理器在本地删除解决方案,然后重新克隆存储库。这删除了本地存储在我的机器上的所有文件,并导致

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

离开。克隆存储库后,我再次尝试了我的命令(在我的情况下是 GIT COMMIT)并且失败没有再次发生。

当我试图解决将功能分支合并到开发分支后发生的合并冲突时,问题出现了。

【讨论】:

【参考方案21】:

以下进程似乎锁定了 .git\index 文件:

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

我终止了进程并运行了git reset HEAD,看起来我现在恢复正常了。

【讨论】:

我想它甚至不需要git reset HEAD。没有它对我有用! 同意,我认为只是锁定索引文件的 ssh-agent.exe 进程。除了杀死它,不需要做任何事情。 我遇到了同样的问题,对我有锁的进程是 Visual Studio Code(或与之相关的东西),因为当我关闭它时,它按预期工作。 对我来说是 explorer.exe,虽然我没有打开实际文件夹或任何子文件夹。关闭所有资源管理器窗口足以解决我的问题。【参考方案22】:

要放弃本地更改,请转到

git reset HEAD

然后检查你的旧提交,删除新提交,然后再次拉取。

git checkout "hashOld"
git branch -d "hashNew"
git pull

【讨论】:

或者在这里阅读,这应该可以工作:***.com/questions/3380805/… 谢谢@JamesMcDonnell。不幸的是,看起来我也不能这样做..(请参阅我的更新)。 你可以删除你的 .git 文件夹,创建一个新的 repo 并拉取。

以上是关于Git 从 index.lock 重命名为 index 失败的主要内容,如果未能解决你的问题,请参考以下文章

在git中将文件批量重命名为小写

git —— 异常1,index.lock

git学习解决git提交代码时报错: Unable to create ‘XXX/.git/index.lock‘: File exists.

关于Git无法提交 index.lock的解决办法(学)

git学习解决git提交代码时报错: Unable to create ‘XXX/.git/index.lock‘: File exists.

GitHub桌面:致命错误“无法创建/project/.git/index.lock:没有这样的文件或目录”[重复]