170

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

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

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

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

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

4

28 回答 28

300

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

于 2015-01-16T14:23:10.440 回答
74

在过去的几天里,我一直遇到同样的问题。基本上,在我不知情的情况下,整个 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 - 肮脏的解决方案

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

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

于 2014-03-12T04:09:26.477 回答
27

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

于 2017-03-04T02:47:41.833 回答
20

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

于 2015-09-19T02:31:59.590 回答
20

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

于 2017-04-30T12:58:11.140 回答
11

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

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

于 2017-12-18T15:31:21.047 回答
11

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

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

于 2019-03-26T13:27:13.040 回答
9

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

于 2015-03-27T15:36:05.027 回答
6

这对我有用:

rm -f ./.git/index.lock
于 2018-02-11T14:45:51.220 回答
4

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

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

查找在 Windows 中锁定文件或文件夹的进程链接指定了以下方法来找出锁定特定文件的进程:

SysInternals Process Explorer - 转到查找 > 查找句柄或 DLL。在“Handle or DLL substring:”文本框中,输入文件的路径(例如“C:\path\to\file.txt”)并点击“Search”。应列出具有该文件的打开句柄的所有进程。

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

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

于 2017-06-13T18:37:48.057 回答
3

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

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

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

于 2016-02-02T13:50:48.363 回答
3

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

于 2018-07-05T13:25:47.850 回答
2

在我的情况下,它是一个并发运行的 EGit。重新启动eclipse后,它照常工作。

于 2015-02-25T14:27:15.437 回答
2

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

于 2016-07-28T21:22:02.700 回答
2

如果你在 rebase 期间得到这个:

这很可能是由于某些软件锁定了您的 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

于 2016-11-16T01:43:34.323 回答
2

没有足够的空间是个问题。清理并重试

于 2017-06-02T04:24:03.273 回答
2

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

于 2019-08-21T19:48:27.933 回答
1

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

于 2014-01-16T05:29:38.557 回答
1

就我而言,它是一个nodemon监视文件系统以进行更改的实例。

于 2019-12-04T15:13:43.317 回答
1

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

于 2021-08-30T08:38:13.487 回答
0

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

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

于 2018-01-08T05:58:33.480 回答
0

这对我有用:

语境:

  1. 在服务器上构建项目

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

  3. 我在本地做过什么操作,我都有这个错误。进一步来说:

    • git结帐
    • git reset HEAD --hard

解决方案

  1. 只需删除文件<work-dir>/.git/index.
  2. Agit status表示项目中的所有文件都没有被跟踪(这里不足为奇)。
  3. git reset HEAD --hard
  4. 回到HEAD detached at <commit-SHA>做 a 的时候git status,但是你应该能够
  5. git checkout <some-branch>

你又回到了正轨!

!!重要的 !!

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

希望它会有所帮助:)。

于 2018-01-18T10:30:48.713 回答
0

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

还有一次,即使我从 Git Extensions 收到错误,我也能够从 Visual Studio 2015 提交相同的文件。

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

于 2018-03-15T10:38:54.510 回答
0

我的案例有点意思:

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

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

问题已解决。:)

于 2018-06-27T05:19:31.270 回答
0

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

  • 足够的磁盘空间
  • 我有足够的权限,我可以写索引文件,我可以重命名它,我可以创建它,解决方法什么也没做
  • 重新启动 Windows 不起作用
  • 索引未被进程锁定

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

于 2020-09-08T08:17:37.120 回答
0

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

于 2021-10-24T08:37:45.013 回答
0

我再次运行了提交,它工作了....

    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%)
于 2021-12-21T17:37:54.200 回答
-1

与 sudo 一起运行对我有用。

例如:sudo git add -r

于 2021-07-14T06:10:50.503 回答