在 Docker 容器内的 Git 工作树目录中,error: unknown option `cached'运行git diff --cached.
Git 的版本是 2.32.0,它明确指出它应该存在。
当切换回主存储库并将其挂载到容器中时,该命令可以正常工作。
这里发生了什么?
在 Docker 容器内的 Git 工作树目录中,error: unknown option `cached'运行git diff --cached.
Git 的版本是 2.32.0,它明确指出它应该存在。
当切换回主存储库并将其挂载到容器中时,该命令可以正常工作。
这里发生了什么?
所以问题是两方面的。
git diff与大多数其他 Git 命令不同,它甚至可以在 Git 存储库树之外工作。它通过根据是否检测到 Git 存储库更改 CLI 界面来实现此目的。
这种更改 CLI 接口逻辑似乎是“如果当前存储库无效,则使用非 Git CLI 选项”。
在我们的例子中,我们将当前目录绑定挂载到 Docker 容器中。如果当前目录是一个 Git 工作树,那么该.git节点就是一个常规文件,其中包含指向主存储库的路径。但是,容器中不存在该存储库的路径,因此 Git 确定当前目录不是git diff“有效存储库”,因此从我们脚下切换了选项。
此外,Git 的检测似乎不想在“找到.git但它无效”上出错,并且默默地忽略这种情况,并且根据 IRC 频道中的用户,没有办法强制git diff期望当前目录是 Git存储库和错误,如果它是无效的。
有一些解决方法,但大多数都是 hack - 我将把它作为练习留给读者。
tl;dr如果.git是一个文件(因为它在工作树中)并且该文件指向的目录不存在,则git默认将当前目录视为非存储库,这会更改 CLI 选项,git diff因为它是被设计的支持非存储库(与大多数其他git命令不同)。