在 git 中使用 Windows 中具有相同名称但大小写不同的目录

Posted

技术标签:

【中文标题】在 git 中使用 Windows 中具有相同名称但大小写不同的目录【英文标题】:Working in git with directories with the same name but different case in Windows 【发布时间】:2015-03-01 04:50:25 【问题描述】:

我想从 Windows 中的 git repo 中提取,它有两个目录,名为 Foofoo。两个文件夹的内容不同。

由于 Windows 不区分大小写并且不允许文件夹名称相同但大小写不同,我该如何推送到 git 存储库?

【问题讨论】:

不知道它在实践中的效果如何,不介意尝试,but there's this。 NTFS 本身在区分大小写的情况下工作得很好,但所有 Windows 都默认覆盖它。 【参考方案1】:

简答:你不能轻易做到这一点。

默认情况下,这是 Windows 子系统的限制。除非您使用较低级别的系统调用,否则 Windows 不能在不同的大小写之间有所不同;因此即使 Git 能够跟踪差异,它也无法将这些差异传达给文件系统。

正如phuclv 在 cmets 中指出的那样,可以将 Windows 内核重新配置为区分大小写。在 Windows 10 中,这甚至可以工作 for individual folders,因此您可以使用它在需要的地方添加兼容性。但是,每个文件夹的大小写敏感性不会被继承,因此您需要为 Git 创建的文件夹手动更改此设置,这可能会有点麻烦,这主要是一种解决方法。

相反,您可以使the whole file 系统区分大小写,但这可能会产生额外的影响,所以如果您想这样做,请小心。

另外请注意,即使在较低级别支持区分大小写的内容,大多数 Windows 应用程序(包括内置 Windows 工具)也可能无法使用此功能。因此,这只允许您通过某些工具使用这些文件。例如,我的猜测是大多数基于 GUI 的 Git 工具根本无法在这里工作。

如果您不想进行这些修改,那么您可能还可以创建部分提交,您只需将文件添加到正确的文件夹(您需要在中间重命名以获取不同的大小写)。但这将是非常不切实际的。

在我看来,最好的解决方案是简单地避免在名称冲突的文件夹中使用多个文件。即使在区分大小写的系统上,这只会让事情变得更加混乱。通过完全避免这种情况,您还可以让所有其他开发人员更轻松地与项目进行交互。

【讨论】:

NTFS 区分大小写,它不是 NTFS 限制:superuser.com/questions/364057/why-is-ntfs-case-sensitive。实际上,我会编辑答案。 NTFS 符合 POSIX 标准,可以存储任何 POSIX 名称。它甚至可以存储 POSIX 权限(用于Microsoft POSIX subsystem、Subsystem for UNIX-based Applications 和后来的windows-subsystem-for-linux) How do you make Windows 7 fully case-sensitive with respect to the filesystem?。在 Windows 10 中它更简单,因为有 per-directory case sensitivity @phuclv 谢谢,我不知道你可以相对容易地改变行为。我已经更新了我的答案,希望能正确反映这一点,尽管我的建议仍然是一样的^^ - 感谢您的意见!【参考方案2】:

作为 poke 回答的后续行动,您需要将这些目录拆分为不同的名称,或者将它们正确地合并为一个具有相同名称的目录,这当然取决于您的需要。它们不能有相同的名称,并且不能在 Windows 中运行(无论如何以清晰明了的方式)。

我不小心落到了同一条船上。我不知道怎么做,因为我一直在使用 Windows,但是在某些时候我更改了 repo 目录中的大小写,一些文件最终保留在一个具有“旧”名称的目录中,一些文件与“新”名称。在我的 Windows 机器上,它们都使用了新名称,但是当我将存储库拉入 Linux 时发现了这个问题,并在查看我的 Assembla 存储库时确认了拆分。

为了解决这个问题,我首先将 克隆到我的 Windows 机器上的一个单独位置。这样做,所有文件又在一个目录中,因为显然这两个目录刚刚合并。然后我将该问题目录重命名为“temp”(使用 TortoiseGit “rename”操作)。然后,我将 repo 克隆到另一个位置。那时,这两个目录实际上在 Windows 中是分开的。我有一个“临时”,加上带有“旧”名称的目录。

因为我确实希望它们在一个目录中(在所有平台上!),我将文件从旧命名目录移到“temp”,然后删除“旧”目录。接下来,我将 temp (再次使用 TortoiseGit “重命名”操作)重命名为我想要的名称,再次提交并推送。最后,我将更改提取到我的原始存储库(我的 linux 存储库)中,并查看了 Assembla。一切终于达成一致,所以我删除了那些临时克隆并收工。

【讨论】:

我也遇到了同样的问题。在这里可以找到更简单的解决方案:***.com/questions/11183788/… 酷。谢谢。

以上是关于在 git 中使用 Windows 中具有相同名称但大小写不同的目录的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows cmd 中,如何在当前目录中运行可执行文件(而不是在 %PATH% 中具有相同名称的可执行文件)而不参考完整路径? [关闭]

使用Inno Setup安装具有不同配置的同一Windows服务的多个实例

如何在 C 中取消设置变量以允许稍后使用具有不同数据类型的相同名称?

在具有相同名称的不同名称空间中招摇不同的类不起作用

在循环中以编程方式创建具有相同名称的 SKSpriteNodes 上使用 repeatActionForever?

如何使用 django 在 mysql 中的两个不同模式中使用两个具有相同名称的表