Git-windows区分大小写的文件名未正确处理

use*_*800 36 git msys

我们在unix中有git bare存储库,它具有相同名称的文件,仅在情况下有所不同.

例:

GRANT.sql
grant.sql
Run Code Online (Sandbox Code Playgroud)

当我们将裸存储库从unix克隆到windows框时,git status会将文件检测为已修改.工作树仅使用grant.sql加载,但git status比较grant.sql和GRANT.sql,并在工作树中显示已修改的文件.

我尝试使用core.ignorecase false,但结果是一样的.

有什么方法可以解决这个问题吗?

Jör*_*tag 41

Windows不区分大小写(更确切地说,保留大小写).根本没有可能的方法存在两个文件,其名称仅在大小写上有所不同:两个仅在大小写不同的文件名是相同的文件名.期.

因此,Git走在存储库中,一个接一个地检出一个文件,直到它碰到两个问题文件中的第一个.Git检查它,然后进一步了解它的业务,直到它到达第二个文件.再次,Git检查出来.从Windows的角度来看,文件名与第一个文件名相同,第一个文件只会被第二个文件覆盖.现在,Git认为第一个文件被改为与第二个文件具有相同的内容.

请注意,这与Git无关:如果你有一个tarball,一个zipfile或一个Subversion存储库,就会发生同样的情况.

如果您想在多个不同的平台上进行开发,您必须尊重这些平台的限制,并且您必须将自己局限于所支持的所有平台的最低标准.Windows支持ADS,Linux则不支持.OSX支持资源分叉,而Windows则不支持.BSD支持区分大小写,而Windows则不支持区分大小写.所以,你不能使用任何这些.就是那样子.

core.ignorecase这不会帮助你,因为它处理完全相反的问题.

  • 修复此问题并不意味着使其正常工作。解决此问题意味着您会将疯狂的行为转换为明显的错误。 (2认同)
  • 绝对有一种方法可以让两个文件存在,其名称仅大小写不同,但需要更改注册表。Cygwin做到了,但我不知道msys是否可以(有一个特殊标志需要传递到Win32 API中):https://cygwin.com/cygwin-ug-net/using-specialnames.html (2认同)

Gre*_*ill 33

我刚遇到类似的问题.在我的例子中,具有相似名称的两个文件仅在大小写不同的子目录中与Windows克隆无关.Git 1.7具有稀疏检出功能,允许您从工作副本中排除某些文件.要排除此目录:

git config core.sparsecheckout true
echo '*' >.git/info/sparse-checkout
echo '!unwanted_dir/' >>.git/info/sparse-checkout
git read-tree --reset -u HEAD
Run Code Online (Sandbox Code Playgroud)

在此之后,unwanted_dir/子目录完全从我的工作副本中消失,Git继续正常处理其余文件.

如果你GRANT.sqlgrant.sql没有在Windows克隆相关的,那么你可以添加自己的名字.git/info/sparse-checkout,以明确排除这些文件.

  • 这个答案太棒了,也适用于文件名太长的问题。感谢您解除我的头痛!!!几个月前给了+1。 (2认同)
  • 很棒的解决方案!我需要将设置设为 `core.sparseCheckout` 才能使其工作 (2认同)

Mar*_*tos 4

我不确定这是否可能。Git 的ignorecase 处理单个文件的大小写差异。它无法解决 Windows 无法在一个目录中拥有两个仅大小写不同的文件名的问题。

FWIW,拥有两个相同的文件名但就其情况而言是一个非常糟糕的主意,即使在 Unix 上也是如此。

  • 如果 Linux 内核开发者都同意你的观点就好了…… (2认同)