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


128

我已经看到许多其他关于此的主题,它们并没有帮助。

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

严重的:无法写入新的索引文件

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

为什么会这样呢?锁是否可以防止某些事情发生?如果是这样,我如何/如何在OS X上解锁问题文件?远程存储库是Google代码,如果这有所作为,尽管我还没有推送到远程存储库。一切都是本地的。


不确定是否应该转到SuperUser
MMM 2013年

最有可能是访问权限问题(运行git的用户没有对所有存储库的写权限)
Nevik Rehnel 2013年

SO和SU中有关于此的线程。我认为问题在这两个方面同样有效。Nevik,回购的权限为777,包括./git文件夹。
杰夫,

您什么时候看到这个问题?当您执行“ git mv”或“ git add”时?
Mayur Nagekar 2014年

Answers:


220

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


64

最近几天我一直遇到同样的问题。基本上,在我不知情的情况下,整个存储库都已移至新的文件系统,当我尝试运行git status时,突然报告该存储库中的每个文件都已删除。

可能的解决方案

因此,经过大量Google搜索,我尝试了以下操作:

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

tl:dr-肮脏的解决方案

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

我知道它不是真正的“解决方案”,但现在它神奇地工作> <,所有文件/分支都完整无缺。如果有人知道为什么这样做可能会起作用,请告诉。


82
发现了另一个原因:您可能没有磁盘空间。
lennartcl 2014年

21
就我而言,Google云端硬盘正在上传(备份)文件,并且在此过程中它们被锁定。完成上传后,提交就可以了。
Kristjan O.

3
感谢您提供有关Google云端硬盘的提示。我遇到了相同的问题,但使用了Dropbox。
hgolov '17

1
重新启动对我有用。在一个半空的22 TB共享驱动器上工作,因此空间不是问题。
韦恩·卡斯基

1
您的“肮脏的解决方案”对我
有用


17

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


如果您的用户帐户最近有任何权限问题,则可能会导致您遇到此问题。就我而言,这是一个Active Directory集成问题,使我遇到了有问题的ACL。
克里斯,

17

如果您在某种在线同步服务(例如google驱动器或保管箱)中设置了github,请尝试禁用同步,因为同步服务会尝试对文件进行读/写,而github会这样做,导致github无法正常工作正确地。


这是对我有用的解决方案。谢谢!
Macondo

7

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


6

关闭Visual Studio代码(在我的情况下,该文件具有在文件保存上运行的自动上载后台作业)为我解决了此问题。

感谢您的解决方案:我的朋友和同事Arnel。


我已经关闭了服务器的NodeJS在我的angularJs应用程序正在运行,该指数解锁
拉杜丽努


6

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

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


3

我将ACL(以某种方式)附加到.git文件夹中的所有文件。

ls -le在.git文件夹中进行检查。

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


3

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


2

就我而言,这是并发运行的EGit。重新启动eclipse之后,它照常工作。


问题是“为什么会出现错误消息?” 这个答案描述了另一个潜在原因。
抢劫

2

如果您使用的是Windows框,请确保您正在使用的程序(无论是源树还是git终端)都以管理员身份运行。我收到了完全相同的错误消息。您可以右键单击该程序以管理员身份运行,也可以将其属性更改为始终以管理员身份运行。




1

您是否尝试过'git add'。。会发生所有变化吗?(您可以通过git reset HEAD删除不必要的添加文件)


1

该错误消息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\index被锁定vmware-vmx.exe。暂停VMWare Player虚拟机(可通过共享文件夹访问git repo)解决了该问题。


尽管此链接可以回答问题,但最好在此处包括答案的基本部分并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能无效。- 评分
铝Sweigart

@Al,我根据您的建议更新了答案。
风扇

0

如果您在重新注册期间得到此信息:

这很可能是由于某些软件锁定了您的存储库的索引文件引起的,例如备份软件,防病毒软件,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


0

问题:当我在git中签出一些修改过的文件时,出现此错误。我有两个用户ABC和XYZ。文件具有ABC的uid:gid,但没有git访问权限,并尝试使用该文件签出文件。

我尝试过的解决方案:XYZ具有git访问权限,尝试使用sudo签出文件,并且有效.. !!


0

这对我有用:

内容:

  1. 在服务器上构建项目

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

  3. 我在本地进行的任何操作,都会出现此错误。进一步来说:

    • git checkout
    • git reset HEAD-硬

  1. 只需删除文件<work-dir>/.git/index
  2. A git status表示未跟踪项目中的所有文件(在此不足为奇)。
  3. git reset HEAD --hard
  4. 回到执行HEAD detached at <commit-SHA>git status,但是您应该能够
  5. git checkout <some-branch>

您又回到了正轨!

!! 重要!

这仅是因为我是“早期”建筑。没有对代码执行任何宝贵的修改。如果您实际上处于“开发时间”,那么我会建议您先保存您的工作,或者使用其他方法。

希望它会有所帮助:)。


0

我在Windows上使用GitExtensions遇到了这个问题。通过为包含存储库的当前用户(我)授予完全权限来修复。

还有一次,即使我从Git Extensions中得到了错误,我仍然能够从Visual Studio 2015提交相同的文件。

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


0

我的情况有点有趣:

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

然后索引似乎已被锁定。因此,我再次运行git log,然后按Q退出。

问题已解决。:)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.