【发布时间】:2011-07-31 09:59:17
【问题描述】:
突然间我收到这个 git 错误:""git status --porcelain failed"" 当我执行 git status 时...。这是怎么回事?
【问题讨论】:
-
如果你移动了文件并且在 repo 中有多个 .git 文件可能会导致这个问题,请确保存档的根目录中只有一个 .git 文件
标签: git version-control github
突然间我收到这个 git 错误:""git status --porcelain failed"" 当我执行 git status 时...。这是怎么回事?
【问题讨论】:
标签: git version-control github
在我的例子中,我已经将一个子模块移动到另一个目录并且我收到了错误消息。
.gitsubmodule 以匹配子模块的当前路径。<currentPathOfSubmodule>/.git ,gitdir 必须匹配 .git/modules/<pathOfSubmodule>。有很多../../,可以用ls查看。得到那个错误:-)
致命:无法 chdir 到 ../<someWhere>:没有这样的文件或目录
致命:git status --porcelain 在子模块中失败
编辑.git/modules/<pathOfSubmodule>/config,worktree必须匹配子模块的当前路径。
完成。
【讨论】:
在一些类似的 StackOverflow 问题中可以找到此错误消息:here、here。谷歌搜索显示a mailing list message with this error。没有人解释它为什么会发生,所以我想我会添加我发现的内容。
一些术语概述,来自man git 页面:
GIT 命令
我们将 git 分为高级(“瓷器”)命令和低级(“管道”)命令。
从上面的帖子看来,当git status 运行时,它会调用git status --porcelain。 man git-status 有助于告诉我们--porcelain 标志的用途:
--瓷器
以易于解析的格式为脚本提供输出。这类似于短输出,但仍将保留 跨 git 版本稳定,无论用户配置如何。详情见下文。
因此,您遇到的问题与 git status 调用有关,默认情况下,它会尝试将其输出格式化为易于解析的内容。
从上面的帖子中,特别是here 和mailing list contentets 的答案,我建议无论出于何种原因,您的 git 存储库已损坏。如果您正在使用子模块,则其中一个可能已损坏 - 这是相关的,因为
status 在每个填充的内部运行“git status --porcelain” 子模块,看看它是否包含更改 (link)
除非明确告知不要这样做。
至于 为什么 你似乎有一个损坏的 git 存储库?我不知道。 StackOverflow 上的其他几个人提到了覆盖、移动、替换或通常摆弄他们存储库中的.git 目录。幸运的是,你有备份,对吧? ;)
【讨论】:
gitdir 的值;执行git mv 导致此路径无效。看起来 git 不够聪明,无法在移动文件时更新子模块路径,即使使用它自己的生态系统命令也是如此。
fatal: cannot chdir to '../../../../Modules/my_include': No such file or directory,所以我创建了Modules/my_include,这让那个错误消失了
通常,git会在项目的根目录(.git/)中创建一个隐藏目录
当您在 CMS 上工作时,您可以安装带有 .git/ 目录的模块/插件,其中包含特定模块/插件的 git 元数据
如果您不想使用 git 的子模块功能,最快的解决方案是删除除根 git 元数据目录之外的所有 .git 目录。 如果这样做,git 不会将这些模块视为项目子模块。
cd /path/to/your/project/code
find ./ | grep ".git/index"
一旦找到删除“.git”除根目录之外的所有目录,但如果您删除它,则再次初始化您的回购
【讨论】: