我在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可能已经忽略了这些文件,但现在我们现在......)
第一个/修改过的文件(ABC.png)可能是因为我的macbook不区分大小写,因为存储库中既有abc.png又有ABC.png。但是,由于这些是客户服务器上传的,我不能删除其中任何一个。所以这是我现在无法解决的第一个问题。
对于其他文件,我完全不知道如何摆脱它们。与其他情况没有重复,所以我怀疑特殊字符。我删除了整个本地存储库并再次克隆它,它立即附带了这4个文件,到目前为止我尝试的任何东西都不起作用(git clean -ndx,git reset --hard,git fetch with various parameters)。
即使存在本地未跟踪或修改的文件,通常拉动和推动也能正常工作,只要这些文件不受提交的影响。但这次我什么都做不了,我真的不知道为什么......
我希望一些git专家可以帮助我!
答案 0 :(得分:0)
这种情况很难处理。它不是不可能,但可用的工具并不合适。
这个问题正是您所怀疑的:您的主机操作系统对Git没有的文件名(路径名)提出了特殊要求,并且使用Git的人违反了。 Git 并不关心那里有人ABC.png
和abc.png
; Git 可以分别存储这两个路径名;但是在您的工作树中,您将自己完成工作,您的计算机 关注并拒绝允许您同时拥有这两个文件。变音符号的文件名是相似的,但有些不同:在UTF-8中,可以将这样的名称表达为组合字符序列,或者使用具有“内置”变音符号的代码点。 Git允许,但MacOS强制您使用MacOS更喜欢的名称。
这意味着要使用此存储库,您必须在不使用工作树的情况下工作 - 或者至少不使用Git通常的工作树机制。使用git update-index
(可以使用原始字节字符串)和git cat-file -p
(使用哈希ID提取底层Git对象)可以,但通常非常痛苦。
在Mac上处理此问题的最简单方法是在VM中安装Linux,例如使用vagrant。然后你有一个Linux系统 让你有两个名称的文件,并且不会尝试将Unicode规范化应用于UTF-8名称。