【问题标题】:PSR-4 specs and git behaviorPSR-4 规范和 git 行为
【发布时间】:2021-11-24 11:01:10
【问题描述】:

我正试图弄清楚为什么过去两天我发生了几件事。

我有一个这样的文件夹结构:

includes/bootstrap/Loader.php

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

App\Bootstrap

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

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

  1. 这是它在我的本地 Mac 上运行而不是在 Web 服务器上运行的根本原因,对吧? Linux 区分大小写的事实?

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

App\Bootstrap

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

App\bootstrap.

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

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

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

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

  1. git 会尝试在 Mac 上为其他人小写 repo 吗?我怎么能阻止这类事情的发展呢?是不是 repo 中的某些文件夹名称以前是小写的?我读到默认情况下 git config ignore case 设置为 false...为什么我必须再次运行它才能让 git 尊重文件夹名称大小写?

【问题讨论】:

    标签: git autoload psr-4


    【解决方案1】:

    通常,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 上的默认设置。请注意,某些程序不能优雅地处理此问题,并且在区分大小写的文件系统上运行时可能会导致问题。

    【讨论】:

    • 感谢您的回答,在我发布问题后,我回到 github,发现目录上有两个副本!在我进行了更多谷歌搜索后,我遇到了git rm -r --cached 命令并使用. 运行它,以便它可以更正所有目录。我只想做一些 psr4 自动加载并陷入文件系统不兼容的深坑
    猜你喜欢
    • 1970-01-01
    • 2015-01-08
    • 2014-09-12
    • 2014-07-25
    • 2020-05-30
    • 2017-11-20
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多