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

Posted

技术标签:

【中文标题】Git\'致命:无法写入新的索引文件\'【英文标题】: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”时? 【参考方案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】:

这对我有用:

上下文:

    在服务器上构建项目

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

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

    git 结帐 git reset HEAD --hard

解决方案

    只需删除文件<work-dir>/.git/indexgit status 表示项目中的所有文件都没有被跟踪(这并不奇怪)。 git reset HEAD --hard 在执行git status 时返回HEAD detached at <commit-SHA>,但您应该能够 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://***.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%)

【讨论】:

以上是关于Git'致命:无法写入新的索引文件'的主要内容,如果未能解决你的问题,请参考以下文章

GIT 致命:无法写入 new_index 文件

Git 克隆失败 - 致命:远程端意外挂断。致命:早期 EOF 致命:索引包失败

错误:无法创建符号链接,致命:无法将索引文件重置为修订版“HEAD”

git索引损坏

gpg无法签署致命的数据:无法写入提交对象[Git 2.10.0]

致命错误:无法比较属于不同集合的索引: