git diff --cached:未知选项“缓存”

git diff --cached: unknown option `cached'

在 Docker 容器内的 Git 工作树目录中,当 运行 git diff --cached.[=13= 时出现错误 error: unknown option `cached' ]

Git 在版本 2.32.0 上,明确说明它应该存在。

当切换回主存储库并将其安装到容器中时,该命令可以正常工作。

这是怎么回事?

所以问题是两方面的。

git diff 旨在甚至在 Git 存储库树之外工作,这与大多数其他 Git 命令不同。它通过根据是否检测到 Git 存储库更改 CLI 界面来实现此目的。

此更改 CLI 界面逻辑似乎是“如果当前存储库无效,则使用非 Git CLI 选项”。

在我们的例子中,我们将当前目录绑定安装到 Docker 容器中。如果当前目录是 Git 工作树,那么 .git 节点是一个常规文件,其中包含主存储库的路径。但是,那个存储库的路径在容器中不存在,因此Git确定当前目录不是“有效存储库”从而关闭了我们脚下的 git diff 选项。

此外,Git 的检测似乎不想在“找到 .git 但它无效”时出错,并默默地忽略这种情况,根据 IRC 中的一位用户的说法channel 无法强制 git diff 期望当前目录是 Git 存储库,如果无效则出错。

有一些解决方法,但大多数都是 hack - 我将把它作为练习留给 reader。


tl;dr 如果 .git 是一个文件(因为它在工作树中)并且该文件指向的目录不存在,git 默默地将当前目录视为非存储库,这会更改 git diff 的 CLI 选项,因为它被设计为支持非存储库(与大多数其他 git 命令不同)。