【问题标题】:Git rename from index.lock to index failedGit 从 index.lock 重命名为 index 失败
【发布时间】: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)

标签: windows git windows-7 github


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    1. 右键单击.git,然后打开属性
    2. 安全标签上,点击高级
    3. 高级安全设置中,点击所有者旁边的更改 strong>(即使它已经正确)。
    4. 选择用户中,选择普通用户,然后点击确定
    5. 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://stackoverflow.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 flagmap 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
                              

                              【讨论】:

                              • 或者在这里阅读,这应该可以工作:stackoverflow.com/questions/3380805/…
                              • 谢谢@JamesMcDonnell。不幸的是,看起来我也不能这样做..(请参阅我的更新)。
                              • 你可以删除你的 .git 文件夹,创建一个新的 repo 并拉取。
                              猜你喜欢
                              • 2013-08-25
                              • 2010-12-28
                              • 2020-11-03
                              • 1970-01-01
                              • 2020-05-15
                              • 2012-08-04
                              • 2013-12-29
                              • 2016-12-08
                              • 1970-01-01
                              相关资源
                              最近更新 更多