Glob通配符

glob 模式是一种文本表达式,它使用大多数命令行用户熟悉的通配符来匹配一个或多个文件名。例如,* 是匹配任何名称的 glob, Readme.txt 是匹配一个名为 Readme.txt 文件的 glob。 对于 VisionByte 的 glob 而言,完整路径名只是一个字符串,并且 glob 不会对名称的目录部分应用任何特殊含义。 因此,glob的 * 匹配任何名称,包括任何目录前缀,并匹配具有一个或多个目录组件 */* 的名称。

尽管 glob 和 正则表达式(RE) 使用一些相同的特殊字符来实现类似的目的,但不能将其混淆。 它们不是完全兼容 的模式匹配语言。VisionByte 在将文件名与本文档中描述的设置进行匹配时使用 glob,而不是 RE。

VisonByte 的 *- glob 设置包含一个或多个模式,以使 VisonByte 对匹配的命名文件进行特殊处理。某些命令的选项和某些 VisonByte UI 网页的查询参数也接受 glob 模式。 为了保持一致性, empty-dirs 即使设置不作为 glob 应用,也会将其解析 为 glob,因为它允许应用相同的语法规则。

VisonByte 还接受命令中的 glob,这种处理可能会与您的操作系统的命令 shell 或其 C 运行时系统交互,因为它们可能有自己的 glob 模式处理。我们将在下面详细介绍此类交互。

句法

当 VisionByte 接受 glob 模式时,它通常会接受以空格或 , 分隔的单个模式列表。

解析器允许模式中出现空格和逗号,方法是用单引号或双引号将整个模式括起来。内部引号按字面意思处理。此外,以引号开头的模式在第一次出现相同标记时结束, 而不是在空格或逗号处结束。因此,如下所示:

"foo bar" qux

当列表中的任何模式匹配时,列表就会与文件匹配。

模式必须使用并匹配整个文件名才能成功。部分匹配将导致匹配失败。

glob 模式中的大多数字符都占用文件名的单个字符,并且必须完全匹配。例如,glob 中的 “a” 只匹配文件名中的字母 “a” ,除非它位于特殊字符序列内。

其他字符具有特殊含义,它们可能包括其他普通字符以赋予它们特殊含义:

通配符

说明

*

匹配零个或多个字符的任意序列

?

匹配任意一个字符

[...]

匹配所含字符列表中的一个字符

[^...]

匹配不包含在列表中的一个字符

这些特殊字符和序列可以匹配 / 目录分隔符以及 . 隐藏文件或目录名称中的首字母。这是因为 VisionByte 文件名存储为完整路径名。

上面的括号表达式解释:

可以使用指定字符范围 -,因此 [a-f][abcdef] 匹配的字符完全相同。范围反映 Unicode 代码点,没有任何特定于语言环境的排序序列。

  • 请注意,必须指定从低值到高值的范围:[z-a] 根本不匹配任何字符,从而阻止整个 glob 匹配。

一些字符列表的示例:

通配符

说明

[a-d]

匹配a、b、c、d中任意一个

[^a-d]

匹配排除a、b、c、d

[0-9a-fA-F]

匹配一个十六进制数字

[a-]

匹配 a-

[][]

匹配 ][

[^]]

匹配除 ] 字符的一个字符

[]^]

匹配 ]^

[^-]

匹配除 - 字符的一个字符

空格是指特定的 ASCII 字符 TAB、LF、VT、FF、CR 和 SPACE。请注意,这不包括 Unicode 中提供的许多其他空格字符,例如 U+00A0、NO-BREAK SPACE。

因为 LF 和 CR 都是空格,并且列表中的每个 glob 的前导和尾随空格都被删除,所以当列表存储在文件中时,glob 列表可能会被分成 glob 之间的行,就像版本化设置一样。

请注意, “” 和 ‘’ 是 ASCII 直引号字符,而不是 Unicode 中提供的任何其他引号,更不是工作人员和文字处理器首选的 {}。

文件匹配

在与 glob 模式进行比较之前,每个文件名都应该先转换为规范形式:

  • 所有目录分隔符都应为 /

  • 列表中所有具体的文件名都是基于工作副本根目录的相对路径

  • 文件名区分大小写

glob 必须与整个规范文件名匹配才被视为匹配。

这样做的目的是让每个特定文件的名称尽可能简单,并且无论您在哪个平台上运行 VisionByte,该名称都是相同的。当您从多个平台克隆仓库并在版本设置中有 glob 时,这一点很重要:您希望这些设置在任何地方都以相同的方式解释。

但是请注意,无论主机平台和文件系统如何,VisionByte 中的所有 glob 匹配都是区分大小写的。POSIX 平台上文件名通常区分大小写,但是大多数 Windows 文件系统都保留大小写但不区分大小写, 也就是说,在 Windows 上名称为 ReadMeREADME 通常是同一文件的名称。在其他情况下也是如此,例如默认情况下在 macOS 文件系统上以及在非 Windows 系统上运行的 Windows 文件系统的文件系统驱动程序中。 (例如 Linux 上的 exfat。)因此,需要编写 VisionByte glob 模式以匹配签入仓库的文件的名称。

文件匹配的一些示例:

通配符

说明

README

README 仅匹配树根目录中的文件。它不匹配名为 src/README 的文件,因为该文件不包含任何匹配 src/ 部分的字符。

*/README

匹配 src/README。与 Unix 文件通配符不同,它还匹配 src/library/README。但是它不匹配 README 作为树根目录中的文件,只匹配 README 作为子目录的文件。

*README

匹配树根目录中的 src/README 文件以及树根目录下的 README 文件。以及 foo/bar/README 或树中任何其他名为 README 的文件,包括 A-DIFFERENT-READMEsrc/DO-NOT-README 文件,以及任何其他文件名以 README 结尾的文件。

src/README

在 Windows 上匹配 srcREADME,因为在匹配 golb 之前,所有目录分隔符都被重写为规范名称 /,这使得编写在 Unix 和 Windows 上都能工作的 globs 变得容易得多。

*.[ch]

匹配树根中或任意深度的每个 C 源文件或头文件。同样,这与 Unix 文件通配符和 Windows 通配符(故意)不同。

使用 glob

VisionByte 版本控制系统中许多命令会有 glob 设置的命令,如果这些命令使用 glob 模式进行本地设置,则可以部分或者全部覆盖上述忽略文件的 全局设置 。这些选项通常以它们覆盖的设置命名,例如 --ignore 选项覆盖 ignore-glob 文件里的忽略设置。这些命令是:

命令 tarballzip 会生成特定签入的压缩档案。它们可能通过指定 glob 模式的选项进一步限制,这些模式命名要包含或忽略的文件,而不是存档整个签入。

通过 Web 服务器实现或支持的 http 、doc:cgiserverui 命令提供了一种机制来命名一些文件,以便与静态内容一起提供服务,其中 glob 模式列表指定可以提供哪些内容。