Git 跨平台兼容性

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

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

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

  • 事例敏感性
  • 文件和文件夹名称的限制
  • 路径长度限制

事例敏感性

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

尽管 Git for Windows 解决了不区分大小写的作系统的许多问题,但仍然存在一些古怪。

文件和文件夹名称

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

有两种方法可以修复存在案例冲突的存储库:

  • 在区分大小写的环境中查看存储库。 重命名文件和文件夹,使其不再冲突,然后将这些更改推送到存储库。 适用于 Linux 的 Windows 子系统 是这样的环境之一。
  • 对每个冲突使用命令 git mv -f <conflicting name> <non-conflicting name> 。 请注意对两个文件名使用确切大写。

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

分支和标记名称

可以创建两个分支或标记(称为 refs),这些分支或标记仅在大小写上有所不同。 Git 的内部以及 Azure DevOps Services 和 Azure DevOps Server 将它们视为两个单独的 refs。 在用户的计算机上,Git 使用文件系统来存储 refs。 由于歧义,提取和其他作开始失败。

一个小文件表示每个 ref。如果 ref 名称包含斜杠 (/) 字符,则文件夹表示最后斜杠之前的部分。

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

若要修复分支名称,请使用:

  1. 在分支页面上,转到相关提交。
  2. 在快捷菜单上,选择“ 新建分支”。
  3. 为分支提供不发生大小写冲突的新名称。
  4. 返回到分支的页面,并删除冲突的分支。

若要修复标记名称,请:

  1. 在标记页面上,转到标记的提交。
  2. 在快捷菜单上,选择“ 创建标记”。
  3. 为标记提供没有大小写冲突的新名称。
  4. 返回到标记页并删除冲突标记。

路径和文件名限制

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 版本限制路径为 1,016 个字符。 某些文件系统支持 1,016 作为最大路径。
文件名限制为 255 个字符。

最大路径为 4096。

编码支持

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

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

显示有关通过 Web 推送引入编码更改的对话框的屏幕截图。