PSR-4 规范和 git 行为

PSR-4 specs and git behavior

我正在努力思考为什么过去两天发生了一些事情。

我的文件夹结构是这样的:

includes/bootstrap/Loader.php

我的 Loader.php 文件的命名空间是这样的:

App\Bootstrap

composer 是为 PSR4 设置的,源目录作为包含,命名空间作为 App

我的代码在我的 Mac 上本地运行良好,但是当上传到网络服务器时 (linux) 一切都崩溃了,它一直吐出 类 没有找到.我的搜索让我发现 Linux 是区分大小写的,所以我返回并将 bootstrap 文件夹更改为 Bootstrap 所以新结构是 includes/Bootstrap/Loader.php 在生产后一切正常那。

  1. 这就是它在我的本地 mac 而不是网络服务器上运行的根本原因,对吧? Linux 区分大小写?

现在一切正常,我更喜欢我的命名空间是这样的:

App\Bootstrap

希望我的命名空间是这样的:

App\bootstrap.

将代码推送到 github 后,我发现它把所有文件夹名称都小写了!进一步搜索让我发现我必须 运行 it config core.ignorecase false 这样它才能尊重文件夹名称的大小写!

然后我尝试在一个完全不同的目录中下拉回购协议,终端向我显示了这条消息:

  1. “碰撞”是什么意思?文件夹中没有文件。另外 git 上的版本是大写的文件夹名称版本,为什么 git 尝试下载不同的东西?

我可以看到它在终端中显示了这两个版本,但在文件夹中它是 github 上的实际版本...所以我只是想知道为什么它在终端中显示了两个版本。

  1. git 会尝试将 Mac 上的其他人的 repo 小写吗?我怎样才能阻止这些事情向前发展?是不是 repo 中的某些文件夹名称之前被小写了?我读到默认情况下 git 配置忽略大小写设置为 false...为什么我必须再次 运行 以便 git 尊重文件夹名称大小写?

通常,Linux 文件系统区分大小写,因此如果您将文件称为 App\Bootstrap,那么它在文件系统中需要是这种情况。所以是的,第一个问题。

Git 所说的“碰撞”是指您的存储库中有两组路径:一组以 include/Bootstrap 开头,一组以 include/bootstrap 开头。 Git 区分大小写,因此它以不同方式处理这些路径。但是你的Mac不区分大小写,所以当Git去把两套路径都写入文件系统时,只有其中一个能写成功。

至于设置 core.ignoreCase,它的设置反映了您的文件系统的实际能力,不应更改。问题不在于 Git:问题在于您的文件系统根本无法处理这种情况。 Git FAQ explains this in some detail.

要删除重复项,运行 git rm -r --cached includes/bootstrap 然后提交。

您将来可能还希望使用区分大小写的文件系统,这是在 APFS 分区中格式化时的一个选项,尽管它在 macOS 上不是默认设置。请注意,某些程序无法正常处理此问题,并且在区分大小写的文件系统上 运行 时可能会导致问题。