在不区分大小写的文件系统上进行git克隆时,路径区分大小写可能会发生冲突。

47

当我使用git clone克隆存储库时,出现以下警告:

...
warning: the following paths have collided (e.g. case-sensitive paths
on a case-insensitive filesystem) and only one from the same
colliding group is in the working tree:

  'components/User/index.js'
  'components/user/index.js'

我一直在阅读,发现这可能是一个Windows的问题,因为文件夹路径没有启用区分大小写。我也尝试过使用git config --global core.ignorecase false,但它仍然失败。

所有不区分大小写的文件系统(例如Windows 10(NTFS)和macOS(APFS))都会遇到此问题。

有人还遇到了这个问题吗?


5
你的文件系统可能是不区分大小写的,因此无法区分这两个文件名/路径。对于你的文件系统来说,abcabC必须引用完全相同的文件。Git以区分大小写的方式跟踪文件,警告你要克隆的存储库希望将abcabC视为不同的文件,但你的文件系统无法表示这一点。尝试使用区分大小写的文件系统。或者调查冲突的文件是否实际上意味着包含不同的内容。 - gspr
1
@Juan,你从未接受过答案。它们都不正确吗? - Inigo
我知道Juan可能没有使用GitHub,否则他可能已经自己找到了这个解决方案,但是,仅仅因为在macOS上解决这个问题非常困难,我想向任何未来的读者指出,如果你碰巧在GitHub上有该仓库,那么你可以使用GitHub的删除文件功能来删除其中一份拷贝。 - Adrian Schmidt
4个回答

42

定义

  • 区分大小写的文件系统:将john.jpgJOHN.jpg视为两个不同的文件,这是允许的。
  • 不区分大小写的文件系统:将john.jpgJOHN.jpg视为相同的文件,这是允许的。

问题

'components/User/index.js'
'components/user/index.js'

问题在于在大小写不敏感的文件系统(如果你使用的是Windows 10,则为NTFS)中,Useruser不能同时存在于components目录中。

Windows操作系统的解决方案

如果您最近克隆了存储库并且还没有对其进行任何工作,请建议您重新开始。因此,请删除克隆并针对要克隆存储库的目录启用区分大小写,然后重新克隆它。在克隆过程中创建的所有目录都是区分大小写的,git将不再给出此警告。此外,它使您能够清理混乱。

  1. 以管理员身份打开命令提示符。
  2. 转到您要克隆存储库的目录。在本示例中,我将使用C:\Users\Juan\Desktop。您不必cd到此目录即可执行下一步操作,只需知道您的目标目录即可。
  3. 为目标目录启用区分大小写。 命令:fsutil.exe file SetCaseSensitiveInfo "C:\Users\Juan\Desktop" enable
  4. 克隆您的存储库。在本示例中,我将使用https://github.com/torvalds/linux.git。命令:git clone https://github.com/torvalds/linux.git
  5. (可选):如果它们相同,则删除或重命名冲突的文件和文件夹。您需要通过比较它们来验证此操作。要删除,请使用git rm,要移动或复制,请使用git mv
  6. (可选):如果有写入权限(并可能在与团队讨论问题之后),将更改提交并推送到上游存储库。
  7. (可选):禁用区分大小写。命令:fsutil.exe file SetCaseSensitiveInfo "C:\Users\Juan\Desktop" disable

现在您可以回到项目中继续工作了。

来源:Windows Central

macOS的解决方案

在macOS上,您需要重新格式化卷为区分大小写/不区分大小写或完全制作新卷。 Details

思考

您可能遇到此问题是因为克隆了在运行Linux或Mac的计算机上创建的存储库,也许是由他人而不是您本人创建的。这里的教训是始终与对命名方式保持一致,这适用于参与项目的所有人。否则就会发生这种情况的例子。


在Windows上未能正常工作。 - Santanu Biswas
@SantanuBiswas 请详细说明哪些步骤对您无效。对我来说,这个答案完美地解决了我的Windows问题。 - Aron Hoogeveen
1
在我的带有NTFS磁盘的Windows上,我收到了以下错误提示:“错误:不支持该请求。” - Jaap Versteegh
1
啊,通过添加Windows子系统来解决:https://github.com/MicrosoftDocs/windowsserverdocs/issues/977 - Jaap Versteegh
修复Termux在安卓上的问题:只使用内部存储。别无他法! - cregox

5
在macOS上更改整个文件系统的过程非常耗时且具有风险。您可以使用磁盘映像,如此处所述,创建具有特定区分大小写(即“日志记录”)文件系统的虚拟容器:
  • 区分大小写的日志记录HFS+ - Mac OS扩展(区分大小写,日志记录)
  • 日志记录的HFS+ - Mac OS扩展(日志记录)
如果您喜欢使用终端:
  • 使用hdiutil create -type SPARSE -fs 'Case-sensitive APFS' -volname <volumeName> <fileName>创建映像。
  • hdiutil attach <fileName>.sparseimage命令会将映像挂载到/Volumes/<volumeName>,您可以进入该目录。
  • 完成后,只需使用diskutil unmount /Volumes/<volumeName>卸载映像。

您可以在这里找到更多信息。


2

2
换句话说,在管理员 PowerShell 上执行:fsutil.exe file setCaseSensitiveInfo "C:\my folder" enable - karlphillip
我已经启用了这个功能,但当我删除“坏”文件夹时,Windows 会继续删除“好”文件夹。有没有办法使删除区分大小写? - Red Riding Hood
1
@小红帽,要想走出你所陷入的奇怪困境,你需要玩一些小把戏。一旦你脱离了这个困境,你就可以顺利前行。由于你没有提供很多细节,我只能猜测所谓的“小把戏”是:先备份好的文件夹。然后让Windows删除好的文件夹,接着删除坏的文件夹,最后将备份的好的文件夹放回原位。 - Inigo
解决方案不起作用。 - Santanu Biswas

2

我在Windows上解决这个问题的方法是:

  1. 复制文件并将其保存在存储库之外。
  2. 删除存储库中的文件。这会导致git状态中显示两个文件都已删除。
  3. 提交删除并推送
  4. 重新添加文件到存储库,提交并推送

完成后,我的存储库显示为最新状态,没有需要提交的内容。


重新格式化卷似乎有点过度解决的方法,这在我的情况下非常有效。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接