git 区分大小写和特殊字符的问题

git issues with case sensitivity and special characters

我在 github 上有一个远程存储库,它与我的 macbook 和实时服务器 (unix) 同步。 目前,我无法从我的 macbook 拉取或推送到远程,出现以下错误:

error: cannot pull with rebase: You have unstaged changes.
error: please commit or stash them.

我的本地工作副本中有 4 个文件:

modified:   app/webroot/files/uploads/ABC.png

Untracked files:
(use "git add <file>..." to include in what will be committed)

app/webroot/files/get/Ä Ö ü.pdf
app/webroot/files/uploads/xyz Übc.png
app/webroot/files/uploads/def äbc.png

所有 4 个相关文件均来自服务器上的用户上传(gitignore 可能会忽略这些文件,但我们现在...)

first/modified 文件 (ABC.png) 可能是因为我的 macbook 不区分大小写,因为存储库中同时存在 abc.png 和 ABC.png。但是,由于这些是在客户服务器上上传的,我不能只删除其中任何一个。所以这是我现在无法解决的第一个问题。

对于其他文件,我完全不知道如何删除它们。其他案例没有重复项,所以我怀疑是特殊字符。我删除了整个本地存储库并再次克隆它,它立即附带了这 4 个文件,到目前为止我尝试过的任何东西都没有用(git clean -ndx,git reset --hard,git 带各种参数的fetch)。

通常即使有本地未跟踪或修改的文件,只要这些文件不受提交影响,拉取和推送也能正常工作。但是这次我什么也做不了,我真的不知道为什么...

我希望 git 专家可以帮助我!

这种情况很难处理。这并非不可能,但可用的工具确实不够用。

问题正是您所怀疑的:您的主机 OS 对 Git 没有的文件名(路径名)有特殊要求,而使用 Git 的人有违反了。 Git 不在乎有人同时做到了 ABC.pngabc.pngGit可以分别存放这两个路径名;但是在你的工作树中,你将在那里做你自己的工作,你的计算机关心和拒绝让您拥有这两个文件。带有变音符号的文件名相似,但有些不同:在 UTF-8 中,可以将此类名称表示为组成字符的序列,或者使用带有变音符号 "built in" 的代码点。 Git 允许,但 MacOS 强制您使用 MacOS 喜欢的名称。

这意味着要使用此存储库,您必须在不使用工作树的情况下工作——或者至少不使用 Git 的常用工作树机制。使用 git update-indexgit cat-file -p 是可能的,但通常太痛苦了,它允许您使用原始字节字符串,而 git cat-file -p 允许您通过哈希 ID 提取基础 Git 对象。

在 Mac 上处理此问题的最简单方法是在 VM 中安装 Linux,例如,使用 vagrant。然后你有一个 Linux 系统 确实 让你有两种名称大小写的文件,并且不会尝试将 Unicode 规范化应用于 UTF-8 名称。