Git 跨平台兼容性

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

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 提供大小写强制设置,以免出现会导致此情况的推送。 对于开发人员来说,养成使用 Tab 自动补全来提交文件的习惯也会有所帮助。 由于 Windows 和 macOS 均保留大小写,因此这些方法可确保 Git 的内部结构看到与文件系统所用大小写完全相同的大小写。

分支和标记名称

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

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

避免问题的一个简易方法是始终使用全小写的分支与标记名称。 如果已创建两个存在此问题的分支或标记,则可在 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 个字符。

最大路径字符数为 4,096。

编码支持

注意

Azure DevOps Server 2019.1 及更高版本支持本节介绍的编码支持。

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

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

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