PSR-4跨系统运行异常、Git目录大小写敏感相关问题咨询
技术问题解答
问题1
该问题根因确实是Linux系统大小写敏感:
- Linux默认的ext4等文件系统是大小写敏感的,而Mac默认的APFS/HFS+文件系统是大小写不敏感的(可手动配置为敏感模式,但默认关闭)
- PSR-4自动加载规范要求命名空间大小写与对应目录完全匹配,composer会根据命名空间
App\Bootstrap拼接出includes/Bootstrap/Loader.php路径查找文件 - Mac环境下不管目录是小写
bootstrap还是大写Bootstrap都能匹配到文件,Linux环境下必须路径大小写完全一致,所以改名后恢复正常
问题2
这里的冲突是Git索引中存在两条大小写不同的同路径记录导致的:
- 你在修改目录大小写前,已经提交过小写
bootstrap目录的内容到仓库,所以Git历史里同时存在includes/bootstrap/和includes/Bootstrap/两条路径的提交记录 - Mac环境大小写不敏感,两个路径在本地文件系统会被识别为同一个目录,Git拉取时检测到两个路径的提交记录不一致,就会抛出冲突提示
- 本地只显示大写目录,是因为后提交的大写版本文件覆盖了小写版本的本地文件,不代表Git索引里的旧小写路径记录被删除了
问题3
- 其他默认配置的Mac用户拉取仓库不会自动将目录转为小写,会拉取到你最后提交的大写版本,但同样会收到路径冲突提示
- 规避这类问题的方案:
- 所有开发成员全局配置Git规则:
git config --global core.ignorecase false,强制Git识别路径大小写 - 初始化项目时就严格遵循PSR-4规范,目录、文件名与对应命名空间大小写完全统一,避免中途修改大小写
- 必须修改大小写时,使用
git mv 旧路径 新路径命令操作,不要直接手动重命名目录,避免产生冗余历史记录
- 所有开发成员全局配置Git规则:
- 该问题确实和仓库历史中存在小写目录记录有关,如果仓库历史从未提交过小写
bootstrap目录,不会触发该冲突 - Git的
core.ignorecase默认值不是固定的,是初始化仓库时自动检测当前文件系统的大小写敏感性设置的:Linux大小写敏感系统上默认是false,Mac/Windows大小写不敏感系统上默认是true,所以Mac环境需要手动修改配置才能让Git识别目录大小写
内容的提问来源于stack exchange,提问作者Uriahs Victor
相关产品推荐
相关产品推荐

