Git 区分大小写

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

默认情况下,Windows 和 macOS 文件系统不区分大小写(但保留大小写)。 大多数 Linux 文件系统区分大小写。 Git 最初是作为 Linux 内核的版本控制系统构建的,因此不出所料,它区分大小写。

虽然不区分大小写的 OS 的许多问题已在 Git for Windows 中得到解决,但仍存在一些问题。

文件和文件夹名称

在 Linux 上,签出同时包含“File.txt”和“file.txt”的 Git 存储库是没有问题的。 这些是不同的文件名。 在 Windows 和 macOS 上,签出这两个文件将导致第二个文件覆盖第一个文件。 如果两个文件夹只是大小写不同,那么它们的内容最终会在不区分大小写的文件系统上混合在一起。

修复大小写冲突

修复具有此问题的存储库的一种方法是在区分大小写的环境中将其签出。 重命名文件和文件夹,使其不再冲突,然后将这些更改推送到存储库。 适用于 Linux 的 Windows 子系统就是这样一个环境。 另一种方法是对每个冲突使用命令 git mv -f <conflicting name> <non-conflicting name>,注意对两个文件名使用确切的大写。

避免大小写冲突

最好从一开始就避免造成这种情况。 Azure Repos 提供了一种大小写强制设置来防止可能导致这种情况的推送。 对于开发人员来说,养成使用 Tab 自动补全来提交文件的习惯也会有所帮助。 由于 Windows 和 macOS 都保留大小写,这将确保 Git 的内部版本与文件系统使用的大小写完全相同。

分支和标记名称

可以创建两个仅在大小写上不同的分支或标记(称为“引用”)。 Git 的内部版本以及 Azure DevOps Services/TFS 会将它们视为两个单独的引用。 在用户的计算机上,Git 使用文件系统来存储引用。 由于歧义,提取和其他操作开始失败。 每个引用由一个小文件表示,如果引用名称包含 / 个字符,则最后一个 / 之前的部分由文件夹表示。

避免问题的一种简单方法是始终使用全小写的分支和标记名称。 如果已经创建了两个具有此问题的分支或标记,则可以在 Azure Repos Web UI 中修复它。

修复分支名称

在分支页中,导航到相关提交。 在上下文菜单中,选择“新建分支”。 为分支指定一个没有大小写冲突的新名称。 返回到分支页并删除有冲突的分支。

修复标记名称

修复标记名称的步骤类似于分支。 在标记页中,导航到标记的提交。 在上下文菜单上,选择“创建标记”。 为标记指定一个没有大小写冲突的新名称。 返回到标记页并删除有冲突的标记。