【问题标题】:Git: list case-sensitive paths that have collided during cloneGit:列出在克隆期间发生冲突的区分大小写的路径
【发布时间】:2021-08-07 21:37:40
【问题描述】:

在不区分大小写的文件系统(如 NTFS 或 APFS)上克隆包含区分大小写文件路径(例如 /README.md 和 /readme.md)的 git 存储库时,git 只会检查其中一个冲突文件。

在 macOS 中,如何列出所有因不区分大小写而发生冲突的文件?

【问题讨论】:

  • 类似git ls-files | tr '[A-Z]' '[a-z]' | sort | uniq -c的东西——列出索引中的文件,将文件名转换为小写,排序,计算非唯一路径。

标签: windows git macos ntfs apfs


【解决方案1】:

没有内置的东西可以找到这个。 phd's comment 会让你接近,可能足够接近,但可能会有点过拟合(尽管人们可能仍然想了解这些事情)。

例如,假设某个提交有文件:

path/TO/file1.ext
path/to/file2.ext

在您的文件系统上,可能只存在path/TOpath/to。一旦其中之一存在,这两个文件将被放入同一个path/$to 文件夹中,其中$to 是小写或大写。它们仍将是单独的文件,但将通过大小写折叠和排序和唯一破折号-c-ing 调用。

在 macOS 上,由于 Unicode 规范化,我们也可能在路径中发生冲突。 Linux 将名为's' 'c' 'h' 'combining-umlaut' 'o' 'n' 的文件视为一个文件名,将名为's' 'c' 'h' 'o-with-umlaut' 'n' 的文件视为第二个不同的文件名。 macOS 默认文件系统会将这两个名称转换为通用形式,并声称这只是一个名称。 (我不知道 Windows 对此做了什么。)适当的工具也应该考虑到这一点。

请注意,Git 会将每个文件单独存储在索引中,并且可以从文件系统存储文件中更新每个单独的索引条目,而与存储文件的路径名无关。所以我们可以让 Git 建立一个从内部名称到外部名称的映射,并让它自动处理这些情况。但这是一项相当大的任务。

【讨论】:

    猜你喜欢
    • 2020-12-07
    • 2022-06-17
    • 2018-03-29
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多