Git 'fatal: Unable to write new index file'

200

我看到许多其他关于这个问题的帖子,但它们并没有帮助。

我有一个非常简单的存储库 - 两个JavaScript文件。 我的Macbook上有100 GB以上的空间。 当我尝试将文件移动到子目录并在本地暂存更改时,会出现以下错误...

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

无论是在终端中执行所有操作还是使用SourceTree等GUI,都会发生这种情况。 另外,其中一个文件被锁定,我无法删除工作目录,直到重新登录。

为什么会发生这种情况? 锁定是否阻止某些内容的编制版本? 如果是,如何在OS X上解锁问题文件?远程存储库是Google Code,但我还没有推送到远程。一切都是本地的。


不确定这是否应该转到超级用户 - MMM
2
很可能是访问权限的问题(运行git的用户没有对整个仓库的写入权限)。 - Nevik Rehnel
1
这个问题在SO和SU上都有相关的讨论。我认为无论在哪里提问都可以得到同样好的回答。Nevik,该仓库的权限是777,包括./git文件夹。 - Jeff
你是在什么情况下遇到这个问题的?是在执行“git mv”或“git add”命令时吗? - Mayur Nagekar
你可能已经用尽了磁盘空间。请使用命令:df -h - Vito Bryliano
29个回答

345

在我的情况下,磁盘空间已满,所以我必须从硬盘中删除文件以释放空间。


太好了,如此简单...谢谢。 - MrHIDEn
如果不是因为这个答案,我甚至都不会去检查那个问题...但是,它解决了问题,太棒了:D - Kalko
源满?还是目的地满?(仓库) - jim
如果我没记错的话,源代码是完整的。 - Alexander Bird

77

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

可能的解决方案

因此,在大量搜索后,我尝试了以下方法:

  • 更改.git权限(相同问题)
  • 更改.git/index权限(相同问题)
  • 将所有更改添加到提交中(相同问题)
  • 删除已删除的文件,因为它们报告文件名太长的错误(相同问题)
  • git重置(软件|Head|Hard)(相同问题)
  • git clean(相同问题)
  • 关闭Windows Defender(相同问题)
  • 更新git(相同问题)
  • 使用不同的git客户端(我使用gitbash)(相同问题)
  • 喝两杯咖啡而不是一杯(相同问题)

tl:dr-临时解决方案

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

我知道这不是真正的“解决方案”,但现在奇妙地工作了><,所有文件/分支都完整无损。如果有人知道这可能起作用的原因,请告诉我。


88
发现另一个可能原因:你的磁盘空间可能已满。 - lennartcl
27
在我的情况下,Google Drive 正在上传(备份)文件,并在此过程中锁定了这些文件。等它上传完毕后,提交就可以正常工作了。 - Kristjan O.
7
谢谢你提供关于Google Drive的提示。我遇到了同样的问题,不过是在使用Dropbox时。 - hgolov
1
重启对我有用。我正在处理一个半空的22TB共享驱动器,所以空间不是问题。 - Wayne F. Kaskie
2
你的“临时解决方案”对我起了作用(返回到以前的索引文件,重新添加并提交自那时以来的所有更改)。 - salouri
显示剩余4条评论

34
在我的情况下,暂停Dropbox同步解决了这个问题。

25

我在Mac上遇到了同样的问题。看起来是由于文件系统ACLs引起的。尝试使用chmod -RN /path/to/repo清除ACLs。这样做后,我可以提交更改。使用复制索引文件、删除原始文件并移动副本返回相同的结果。


如果您的用户帐户最近出现了任何权限问题,可能会导致您遇到此问题。在我的情况下,这是一个Active Directory集成问题,让我面临了问题所在的ACLs。 - kris

20
如果您在某种在线同步服务中设置了您的Github,例如Google Drive或Dropbox,请尝试禁用同步,因为同步服务会尝试读/写文件,而Github也会做相同的操作,从而导致Github无法正常工作。

15

在我的情况下,解决方案只是添加新用户的权限。

当我安装了新的操作系统,移动了我的仓库并出现了这个确切的错误时,我选择了根文件夹,然后添加了对该用户的身份验证以检查所有enter image description here


1
谢谢!非常有帮助,我刚安装了Windows 11,并且由于我将存储库移到外置硬盘上而遇到了相同的错误。 - Dynamic Games

11

对于我来说,关闭Visual Studio Code(在我的情况下具有文件保存时运行的自动上传后台作业)解决了我的问题。

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


我已经关闭了Node.js服务器,我的AngularJS应用程序正在运行,索引已解锁。 - Radu Linu

9

我遇到过这样的问题,文件.git/index已被另一个进程(我的本地开发Web服务器)使用。我关闭了该进程,然后它就可以正常工作了。


对我来说也是一样,似乎当你运行 Angular 开发服务器并尝试提交时会出现这个错误。 - Nitin Sawant

7
这对我很有用:
rm -f ./.git/index.lock

5
错误信息 fatal: Unable to write new index file 意味着我们无法将新内容写入git索引文件 .git\index (关于git索引的更多信息,参见这里)。经过审查此问题的所有答案,我总结了以下根本原因:
  • 新内容的大小超过了磁盘可用空间。(解决方案:清理磁盘空间)
  • 用户没有访问此文件的权限。(解决方案:授予权限)
  • 用户具有权限,但是 .git\index 被其他用户或进程锁定。(解决方案:解锁文件)

链接在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 仓库)可以解决此问题。


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。-【来自审查】 - Al Sweigart
@Al,我根据你的建议更新了我的答案。 - Fan

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