Git 跨平台兼容性

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

Windows、macOS 和 Linux 文件系统各有一个或多个其他平台不支持的限制和行为。 由于 Git 是一种跨平台技术,因此一个平台上的开发人员可以提交包含与另一平台文件系统不兼容名称的文件或文件夹。 保护存储库非常重要,因为其他平台上的开发人员可能会不知情地签出由于文件或路径名称而损坏其工作目录的提交。

Azure Repos提供了三个跨平台兼容性设置,可帮助保护存储库免受推送与一个或多个平台不兼容的提交的人员。 这些设置与以下三个文件系统限制相关:

  • 区分大小写
  • 受限文件和文件夹名称
  • 路径长度限制

区分大小写

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

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

文件和文件夹名称

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

修复案例冲突

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

避免案例冲突

最好避免首先创建这种情况。 Azure Repos提供了一个案例强制设置,以防止导致这种情况的推送。 对于开发人员来说,采用使用选项卡完成提交文件的习惯也有助于完成提交文件。 由于 Windows 和 macOS 都是保留大小写的,因此这将确保 Git 的内部版本看到文件系统使用的完全相同的大小写。

分支和标记名称

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

避免问题的一种简单方法是始终使用全小写分支和标记名称。 如果已创建两个分支或标记并出现此问题,可以在 Azure Repos Web UI 中对其进行修复。

修复分支名称

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

修复标记名称

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

路径和文件名限制

Windows、macOS 和 Linux 操作系统各有各种命名限制和最大路径限制。 这些限制可以命名文件或文件夹的内容。 这可以为跨多个平台使用 Git 的团队创建问题情况。

例如,假设一个平台上的开发人员将更改提交到共享存储库,其中包含另一个平台上无效的文件名或路径长度。 稍后,另一位开发人员尝试在内容无效的平台上签出该提交。 这会导致损坏的工作目录,从而可能损坏存储库,并损坏数据。

Azure Repos提供文件名和最大路径存储库设置,这些设置阻止推送包含违反以下一个或多个限制的提交。

文件名 & 路径长度引用表

限制/平台 Windows macOS Linux
文件名限制 保留文件名:CON、PRN、AUX、NUL、COM1 - COM9、LPT1 - LPT9

保留文件名后跟 .

保留字符: \ / : * ? " < >

以空格结尾或空格的 . 文件名
以结尾的文件名 / 以结尾的文件名 /
路径长度限制 Windows 中的路径 的最大长度为 260 个字符, (包括 null 终止符) 。

对于具有 .NET 的目录,完全限定的文件名必须小于 260 个字符,目录名称必须小于 248 个字符。
文件名限制为 255 个字符

HFS+ 中的路径最大值记录为无限制,尽管某些 macOS 版本将它上限为 1016 个字符。 某些文件系统支持 1016 作为最大路径
文件名限制为 255 个字符

路径最大值为 4096

编码支持

注意

Azure DevOps Server 2019.1 及更高版本支持本节中所述的编码支持。

Microsoft 添加了对通过 Web 推送终结点的 UTF-16 和 UTF-32 编码的支持。 这意味着我们将保留编码类型,因此无需将文件重写为 UTF-8。 尝试保存未通过 Web 编码的文件 ((仅支持 UTF 编码) )时,也会看到警告。

以下屏幕截图显示了 Web 推送引入编码更改时看到的对话框示例。

{显示 Web 推送编码更改时对话框的屏幕截图。