【问题标题】:Git 'fatal: Unable to write new index file'Git'致命:无法写入新的索引文件'
【发布时间】:2013-04-10 11:30:24
【问题描述】:

我已经看到了很多关于此的其他线程,但它们没有帮助。

我有一个非常简单的 repo - 两个 JavaScript 文件。我在 Macbook 上有 100+ GB。当我尝试将文件移动到子目录并在本地暂存时,我得到的更改...

致命:无法写入新的索引文件

无论我在终端中执行所有操作还是使用像 SourceTree 这样的 GUI,都会发生这种情况。此外,其中一个文件被锁定,在我注销并重新登录之前,我无法删除工作目录。

为什么会这样?锁是否阻止了某些东西的暂存?如果是这样,什么/如何解锁 OS X 上的问题文件?远程仓库是谷歌代码,如果这有所作为,虽然我还没有推送到远程。一切都是本地的。

【问题讨论】:

  • 不确定是否应该转至SuperUser
  • 很可能是访问权限的问题(运行 git 的用户没有对所有 repo 的写权限)
  • 在 SO 和 SU 中有关于此的主题。我认为问题在任何一个中都同样有效。 Nevik,repo 的权限是 777,包括./git 文件夹。
  • 你什么时候看到这个问题?是在执行“git mv”还是“git add”时?

标签: git locking


【解决方案1】:

你试过'git add。' .会不会全部改变? (你可以通过 git reset HEAD 删除不必要的添加文件)

【讨论】:

    【解决方案2】:

    过去几天我一直遇到同样的问题。基本上,在我不知情的情况下,整个 repo 已被移动到一个新的文件系统,当我尝试运行 git status 时,它突然报告 repo 中的每个文件都已更新。

    可能的解决方案

    所以,经过大量谷歌搜索,我尝试了以下方法:

    • 更改 .git 权限(相同问题)
    • 更改 .git/index 权限(同样的问题)
    • git 添加所有更改以提交(相同问题)
    • git rm-ing 删除文件,因为它们报告文件名太长错误(同样的问题)
    • git reset (soft|Head|Hard)(同样的问题)
    • git clean(同样的问题)
    • 关闭 Windows Defender(同样的问题)
    • 更新 git(同样的问题)
    • 不同的 git 客户端(我使用 gitbash)(同样的问题)
    • 喝 2 杯咖啡而不是 1 杯(同样的问题)

    tl:dr - 肮脏的解决方案

    设法解决问题的唯一方法是复制索引文件,删除原始文件并重命名副本。

    我知道它不是真正的“解决方案”,但现在它神奇地工作>

    【讨论】:

    • 发现另一个原因:您可能磁盘空间不足。
    • 就我而言,Google Drive 正在上传(备份)文件,并且在此过程中它们被锁定。上传完成后,提交工作。
    • 感谢您提供有关 Google 云端硬盘的提示。我遇到了同样的问题,但使用的是 Dropbox。
    • 重启对我有用。在一个半空的 22 TB 共享驱动器上工作,所以空间不是问题。
    • 你的“肮脏解决方案”对我有用(返回到以前的索引文件,从那时起重新添加并重新提交所有更改)
    【解决方案3】:

    就我而言,磁盘空间不足,因此我不得不从硬盘驱动器中删除文件以腾出空间。

    【讨论】:

    • 耶,这么简单...谢谢
    • 如果不是这个答案,我什至都不会检查...但是,是的,它修复了它:D
    • 源代码已满?还是满载而归? (回购)
    • 完整源代码,如果我没记错的话。
    【解决方案4】:

    在我的例子中,它是一个并发运行的 EGit。重启 eclipse 后就可以正常工作了。

    【讨论】:

    • 问题是“为什么会出现错误消息?”这个答案描述了另一个潜在的原因。
    【解决方案5】:

    我碰巧文件 .git/index 正在被另一个进程(我的本地开发 Web 服务器)使用。我关闭了这个过程,然后它就起作用了。

    【讨论】:

    • 对我来说也是如此,似乎当您运行 Angular 开发服务器并尝试提交时,会发生此错误
    【解决方案6】:

    我在 Mac 上遇到了同样的问题。这似乎是由文件系统 ACL 引起的。尝试chmod -RN /path/to/repo 清除 ACL。完成此操作后,我能够提交更改。使用复制索引文件的技巧,删除原始文件并将副本移回也可以达到相同的效果。

    【讨论】:

    • 如果您的用户帐户最近有任何权限问题,可能会导致您遇到此问题。就我而言,这是一个 Active Directory 集成问题,导致我遇到了有问题的 ACL。
    【解决方案7】:

    我将 ACL(不知何故)附加到 .git 文件夹中的所有文件。

    使用 .git 文件夹中的 ls -le 检查它。

    您可以使用chmod -N(用于文件夹/文件)或chmod -RN(递归)删除 ACL

    【讨论】:

      【解决方案8】:

      如果您使用的是 Windows 机器,请确保您使用的程序(无论是源代码树还是 git 终端)以管理员身份运行。我得到了同样的错误信息。您可以右键单击该程序以管理员身份运行,也可以将其属性更改为始终以管理员身份运行。

      【讨论】:

        【解决方案9】:

        如果你在变基期间得到这个:

        这很可能是由于某些软件锁定了您的 repo 的索引文件造成的,例如备份软件、杀毒软件、IDE 或其他 git 客户端。

        在大多数情况下,锁定只是短暂的一瞬间,因此它只是由于时机不佳和运气不佳而发生的。

        但是,git rebase --continue 会抱怨下一个命令是一个空提交:

        The previous cherry-pick is now empty, possibly due to conflict resolution.
        If you wish to commit it anyway, use:
        
            git commit --allow-empty
        

        要解决此问题,只需运行 git reset 并再次尝试 git rebase --continue

        【讨论】:

        • 如果创建了新文件或存在一些修改过的内容,请在git rebase --continue 之前使用git reset --hard--hard 具有破坏性,因此请先发送git status 看看哪些内容可能会被删除。
        【解决方案10】:

        就我而言,暂停 Dropbox 同步解决了这个问题

        【讨论】:

          【解决方案11】:

          如果您在某种在线同步服务(例如 google drive 或 dropbox)中设置了 github,请尝试禁用同步,因为同步服务会尝试读取/写入文件,因为 github 会尝试执行相同操作,从而导致github 无法正常工作。

          【讨论】:

            【解决方案12】:

            空间不足是个问题。清理并重试

            【讨论】:

              【解决方案13】:

              错误消息fatal: Unable to write new index file 表示我们无法将新内容写入git index 文件.git\index(有关git index 的更多信息,请参阅here)。在回顾了这个问题的所有答案后,我总结了以下根本原因:

              • 新内容的大小超过了磁盘的可用容量。 (解决方案:清理磁盘空间)
              • 用户无权访问此文件。 (解决方案:授予权限)
              • 用户有权限,但.git\index 被其他用户或进程锁定。 (解决方案:解锁文件)

              链接Find out which process is locking a file or folder in Windows指定了以下方法来找出锁定特定文件的进程:

              SysInternals Process Explorer - 转到查找 > 查找句柄或 DLL。在“句柄或 DLL 子字符串:”文本框中,键入文件的路径(例如“C:\path\to\file.txt”)并单击“搜索”。应该列出具有该文件的打开句柄的所有进程。

              使用上述方法查找锁定.git\index的进程,然后停止锁定可执行文件。这将解锁.git\index

              例如,Process Explorer Search 表示.git\indexvmware-vmx.exe 锁定。暂停 VMWare Player 虚拟机(通过共享文件夹访问 git repo)解决了这个问题。

              【讨论】:

              • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
              • @Al,我根据你的建议更新了我的答案。
              【解决方案14】:

              关闭 Visual Studio 代码(在我的情况下,它有一个在文件保存时运行的自动上传后台作业)为我解决了这个问题。

              解决方案的功劳:我的朋友和同事 Arnel。

              【讨论】:

              • 我已经关闭了运行我的 angularJs 应用并且索引已解锁的 nodeJs 服务器
              【解决方案15】:

              问题: 当我在 git 中检查一些修改过的文件时,得到了这个错误。 我有两个用户 ABC 和 XYZ。文件的 uid:gid 为 ABC,但它没有 git 访问权限并尝试使用相同的文件签出。

              我尝试过的解决方案: XYZ 有 git 访问权限,尝试使用 sudo 签出文件,它成功了..!!

              【讨论】:

                【解决方案16】:

                这对我有用:

                上下文:

                1. 在服务器上构建项目

                2. git status 返回HEAD detached at <commit-SHA>

                3. 我在本地进行的任何操作都出现了这个错误。更具体地说:

                  • git 结帐
                  • git reset HEAD --hard

                解决方案

                1. 只需删除文件<work-dir>/.git/index
                2. git status 表示项目中的所有文件都没有被跟踪(这并不奇怪)。
                3. git reset HEAD --hard
                4. 在执行git status 时返回HEAD detached at <commit-SHA>,但您应该能够
                5. git checkout <some-branch>

                你又回到了正轨!

                !!重要!!

                这只是因为我正在“愉快地”建造。没有对代码进行任何有价值的修改。如果您实际上处于“开发时间”,那么我建议您先保存您的工作或使用其他方法。

                希望它会有所帮助:)。

                【讨论】:

                  【解决方案17】:

                  这对我有用:

                  rm -f ./.git/index.lock
                  

                  【讨论】:

                    【解决方案18】:

                    我在 Windows 上使用 GitExtensions 时遇到了这个问题。通过授予当前用户(我)对包含 repo 的文件夹的完全权限来修复。

                    另外一次,即使我从 Git 扩展中收到错误,我也能够从 Visual Studio 2015 提交相同的文件。

                    还有一次我不得不从 .git 文件夹中删除“索引”文件

                    【讨论】:

                      【解决方案19】:

                      我的情况有点意思:

                      我运行 git log 来检查某个提交,然后我没有正确退出它,我按 ctrl+c 退出它。

                      然后索引似乎被锁定了。所以我再次运行 git log,然后按 Q 退出它。

                      问题已解决。 :)

                      【讨论】:

                        【解决方案20】:

                        我认为某些后台备份解决方案(例如 Google 备份和同步)会阻止对索引文件的访问。我关闭了应用程序,Sourcetree 完全没有问题。似乎 Dropbox 也是如此(@tonymayoral)。

                        【讨论】:

                          【解决方案21】:

                          就我而言,解决方案只是向新用户添加权限。

                          当我安装新操作系统时,我移动了我的存储库,它显示了这个确切的错误,我选择了根文件夹,然后添加了经过身份验证的用户以检查所有

                          【讨论】:

                            【解决方案22】:

                            我遇到了同样的问题。我重新启动了计算机,问题得到解决。

                            【讨论】:

                              【解决方案23】:

                              在我的例子中,它是一个 nodemon 实例监视文件系统的变化。

                              【讨论】:

                                【解决方案24】:

                                我也有/有这个问题。就我而言,没有任何解释适用:

                                • 足够的磁盘空间
                                • 我有足够的权限,我可以写索引文件,我可以重命名它,我可以创建它,变通方法什么都没做
                                • 重启窗口不起作用
                                • 索引未被进程锁定

                                直到我发现一旦我通过另一台(linux)计算机访问 windows 文件夹,git 就可以毫无怨言地工作。它一定与我在普通 debian buster 计算机上使用的 git 版本有关:git 1.2.20 给了我“无法写入新索引”错误,而从 ubuntu 模糊虚拟机(git 1.2.2)添加文件没有问题。

                                【讨论】:

                                  【解决方案25】:

                                  使用 sudo 运行对我有用。

                                  例如: sudo git add -r

                                  【讨论】:

                                  • 这是一个权宜之计的解决方案,只会级联到更多的权限问题。修复权限比充当超级用户简单地将文件添加到索引中要好。
                                  【解决方案26】:

                                  出于某种原因,从 wsl 终端执行 git add 工作正常。但是崇高的合并总是会给我这个错误。原来VS代码以某种方式阻止了它。关闭 VS 代码使其工作。有人也以同样的方式解决了这个问题 - https://stackoverflow.com/a/47871586/6236710

                                  【讨论】:

                                    【解决方案27】:

                                    安装 Anaconda 后我遇到了同样的问题。我尝试了所有解决方案,例如 permissiondisk-free。所以,我只是删除了 repo 并再次从远程克隆它。它解决了这个问题。

                                    【讨论】:

                                      【解决方案28】:

                                      我再次运行了提交,它成功了....

                                          sbe:/var/xxxxx/rmm/sprcg2/app3536847/sas % git commit -m "My summary"
                                      [master a2257ec] My summary
                                       9 files changed, 2747 insertions(+), 7047 deletions(-)
                                       rename ish_extracts/prog/{t.sas => query.sas} (55%)
                                       rewrite ish_extracts/prog/t.sas (98%)
                                      

                                      【讨论】:

                                        猜你喜欢
                                        • 2011-04-18
                                        • 2014-10-25
                                        • 1970-01-01
                                        • 2020-08-20
                                        • 1970-01-01
                                        • 2017-10-14
                                        • 2013-05-12
                                        • 1970-01-01
                                        • 2011-12-13
                                        相关资源
                                        最近更新 更多