DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

Git 拉取报 untracked 会被覆盖:上游只改了路径大小写

大小写不敏感的工作树可能在大小写改名后阻止更新;核对索引与上游路径,保留本地工作后选择新 checkout 或修正冲突命名。

macOS 上拉取或自动更新时报 The following untracked working tree files would be overwritten by merge,但报错路径原本由 Git 跟踪,工作树也没有普通内容修改。如果上游刚把 README.MD 改成 README.md,需要检查文件系统是否把这两个名称当成同一个文件。

这种故障也可能出现在大小写不敏感的 Windows 工作目录;不是所有 macOS 或 Windows 卷都采用相同规则。以下只处理已经确认的大小写路径冲突,不把所有未跟踪文件覆盖错误都归到这个原因。

把 Git 记录的名称与磁盘名称分开看

例如,一个自动更新的仓库原先跟踪 plugins/tt/README.MD,上游改成 plugins/tt/README.md。Git 的路径记录区分大小写,但当前文件系统可能只能为这两个名称提供同一个磁盘对象。旧工作树与上游新路径交接时,合并保护会阻止覆盖。

先核对报错中的完整路径,再查看仓库配置和索引记录。以下都是只读检查:

git status --short
git config --show-origin --get core.ignoreCase
git ls-files --stage

core.ignoreCase 是 Git 为大小写不敏感文件系统提供兼容处理的配置,clone 或 init 通常会探测并设置。它不是让文件系统变成大小写敏感的开关;不要为了这次拉取随意改成 false。

在索引输出中按精确大小写核对目标路径,并与文件管理器或终端看到的磁盘名称比较。查看已取得的上游提交变化,确认是否只是大小写改名,例如用下面的比较;前提是该分支已配置且已取得 upstream:

git diff --name-status HEAD '@{upstream}'

upstream 尚未取得最新提交时,这个比较不能说明远程现在是什么状态。自动更新器报错后也可能暂时不再提醒,因此应保留失败日志并明确检查更新结果,不能把提示消失当成成功。

先保存本地状态,不用整仓库重置消错

检查工作树修改、暂存内容、本地提交,以及未跟踪和被忽略文件。自动安装的工具仓库也可能有用户自定义内容,不能仅凭目录属于某个工具,就假定其中没有需要保留的工作。

在仓库外保存完整副本或按项目已有方式备份,确保包含需要保留的本地设置。删除碰撞文件、整仓库 reset --hard,或者递归清理未跟踪文件,都可能丢掉本地内容;不要把它们作为未经核对的更新步骤。

如果上游当前只保留一种目标拼写,本地没有要合并的提交,建立新的 checkout 通常比继续修补旧目录更容易核对。例如,在有权限写入的父目录中,使用已确认的仓库地址创建一个全新目录:

git clone '仓库的实际地址' '../repo-fresh'

这里的地址和目录需要替换,目标目录必须不存在或符合 clone 的要求。此操作会写入新目录并取得仓库,不覆盖旧目录。核对新 checkout 的目标路径只有预期拼写,再迁移已经确认需要保留的配置与本地内容;不要连旧 .git 目录一起复制过去。

存在本地提交时,应先保存它们,再按团队的合并或迁移流程处理。新 clone 不会自动包含只存在于旧目录的提交;在确认这些工作完整迁入前,保留旧仓库。

上游同时有两种拼写,新 clone 也不是修复

如果一个提交同时包含 README.MD 和 README.md,或两个目录只在大小写上不同,当前文件系统可能无法完整表示它。此时要在能区分这些路径的工作环境中统一命名,并把修正作为普通提交审查;改本地配置不能替代修正仓库路径。

后续需要仅改大小写时,也应按团队支持的 Git 和文件系统流程记录重命名,核对提交树只有目标路径,并让其他平台的 checkout 检查结果。不要仅在文件管理器中改完名称,就假定 Git 记录和所有协作者的目录已经一致。

完成后检查目标分支与提交、目标路径拼写、保留的本地内容,以及工具实际运行。成功标准是更新不再被同一碰撞路径阻止,仓库树能在当前文件系统完整表示,原来需要保留的工作仍在;旧副本应在这些核对完成后再清理。