我有一个现有项目,已部署到 heroku 并受 git 控制。我一直在定期添加和提交代码。
我最近重建了我正在使用的计算机(OSX,10.6),现在当我调用
git status
我看到了更改,但是当我尝试添加更改的文件进行提交时,我得到了
Dans-iMac-335:[app-name-obscured] apple$ git add public/javascripts/*
fatal: Unable to write new index file
我已经从 heroku git 存储库克隆了该项目,并且可以在那里添加。两个项目中文件的所有权相同。这可能是什么原因造成的?我的选择是将每个更改的文件添加到新克隆的版本并以此方式重建它,但有很多更改,似乎这里可能有修复。
有谁经历过这种情况吗?知道从哪里开始吗?
克里斯:感谢您详尽的回复。
我可以使用 sudo 运行 git。从这个意义上讲,这似乎是一个权限问题,尽管目录是 755,由我拥有,并且所附文件是 644,同样由我拥有(与拥有项目文件的用户相同)。磁盘空间很大,并且目录可写的建议很好,但我从包含项目的目录内部运行 git - 那么它是否仍然需要创建路径?
我的系统上没有找到 ktrace,而且我也不是终端操作方面的专家,但我尝试运行 dtruss。这没有显示任何问题,但我突然想到,因为我必须使用 sudo 来运行 dtruss,这意味着 dtruss 监控的进程也以超级用户身份运行。无论如何,此时它能够将项目添加到 git,而且使用 sudo 我刚刚能够提交它们。问题出在添加新项目时,而不是添加修改的项目时。如果我做了类似的事情
sudo dtruss su <my_username> git add some/file/name/*
我是否可以将 git 作为我的常规名称运行?在我破解了获得所需结果的方法后,我想到了这一点。
我现在可以使用 sudo 来添加和提交项目。我想要做的是让我的 heroku repo 与当前工作保持一致:然后我想我可以克隆它,看看问题是否消失。否则,我会回来的……
答案1
索引通常存储在存储库目录的顶层.git
。可以使用 GIT_INDEX_FILE 环境变量覆盖其位置(可能值得检查:)printf '%s\n' "$GIT_INDEX_FILE"
。
如果索引文件的目录不可写,您将收到一条早期的错误消息:
fatal: Unable to create '/path/to/.git/index.lock': Permission denied
由于您没有收到此错误消息,我们可以相当肯定包含的目录是可写的。
您报告的错误消息是在活动即将结束时发出的git 添加。遗憾的是errno
,git 添加;如果已经报告,我们可能能够根据报告的错误对问题做出猜测。
git 添加显示您报告的错误,如果它在写出新索引的内容(内容写入文件.lock
)时遇到任何问题,或者当它尝试提交锁定文件(重命名文件.lock
以取代现有的索引文件;这是“提交”锁定文件事务,而不是什么)时遇到问题。git 提交做)。
磁盘空间问题?
.lock
保存索引文件的卷上的可用空间如何?可能快满了。当索引所在的卷上有足够的可用空间来创建文件但不足以保存所有内容时,我能够重现错误消息。
“旗帜”问题?
索引文件上是否设置了任何标志?在我的系统上,在索引文件上设置uchg
(“用户级不可变”)或uappnd
(“用户级仅追加”)将导致git 添加给出与你收到的相同的错误消息。检查ls -lO
索引文件中的标志(标志显示在组所有者之后和大小之前;-
如果没有设置标志,它将显示)。如果你看到标志,请使用标志位命令来删除它们。您可能想调查这些标志是如何出现的,以及是否有任何其他文件有它们(可能带有ls -lOR
)。
使用追踪
如果以上建议都不能解决问题,那么你可能会追踪和内核转储在打印错误消息之前立即找出哪个系统调用失败。
ktrace git add whatever
kdump | less
: Go to the bottom. Search for the error message.
: What CALL is RETurning -1? What is the reported errno?
当卷已满时,我看到以下内容:
4728 git CALL write(0x9,0x116d24,0x18b0)
4728 git RET write -1 errno 28 No space left on device
4728 git CALL write(0x2,0xbfffcd00,0x26)
4728 git GIO fd 2 wrote 38 bytes
"fatal: Unable to write new index file
"
当我设置不兼容的标志时,我会看到以下内容:
4742 git CALL rename(0x105bdd,0xbfffdfa8)
4742 git NAMI ".git/index.lock"
4742 git NAMI ".git/index"
4742 git RET rename -1 errno 1 Operation not permitted
4742 git CALL write(0x2,0xbfffcd40,0x26)
4742 git GIO fd 2 wrote 38 bytes
"fatal: Unable to write new index file
"