Glob 与 .gitignore 测试器
用路径列表测试 glob 模式和 .gitignore 规则,查看哪些路径匹配以及由哪条规则匹配。
代码示例
可直接复制到你自己的项目中。每个示例只使用该语言的标准库,因此无需安装任何东西。
const pattern = '*.log'
const names = ['app.log', 'readme.md', 'error.log']
// * stays inside one path segment, ? is one character, everything else is literal.
const source = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '[^/]*').replace(/\?/g, '[^/]')
const matcher = new RegExp(`^${source}$`)
for (const name of names.filter((candidate) => matcher.test(candidate))) {
console.log(name)
}功能
用路径列表测试 glob 模式和 .gitignore 规则。每条路径都会标出匹配与否,并在旁边显示起作用的模式,方便你了解 src/lib/util.test.ts 为什么被包含或排除。
使用方法
- 在路径中每行粘贴一个路径,或拖入文本文件。
- 在模式中每行写一个模式。以
#开头的行是注释。 - 选择 Glob、Bash 或 Gitignore,并显示所有路径、仅匹配项或仅不匹配项。
- 复制结果。
示例
使用模式 src/**/*.ts 和 !**/*.test.ts 时,路径 src/lib/util.ts 匹配,而 src/lib/util.test.ts 因排除优先而不匹配。使用 .gitignore 规则 *.log 和 !keep.log 时,app.log 被忽略,keep.log 不被忽略。
须知
*只在一个目录内,**可跨目录,?、[ab]和{a,b}与 picomatch 中一致。.env这类点文件只有在打开包含点文件或模式写明点时才会匹配。- 在 Glob 和 Bash 中,以
!开头的模式会排除其他模式匹配到的内容。在 Gitignore 中与 Git 一样,最后一条匹配的规则生效。 - Bash 像没有
globstar的 shell 那样把**当作普通*。 - 路径按文本匹配,不会从磁盘读取任何内容。
三种语法是什么意思?
Glob 是大多数构建工具使用的 picomatch 语法:* 只在一个目录内,** 可跨目录,{a,b} 这样的花括号、[ab] 这样的字符类和 ? 也可用。Bash 像没有 globstar 的 shell 那样把 ** 当作普通 *。Gitignore 遵循 .gitignore 规则:末尾的 / 表示目录,开头的 / 锚定到根目录,后面的 ! 规则会重新包含先前规则忽略的内容。
常见问题
路径旁边显示的是哪条规则?
第一个匹配的模式。在 glob 和 bash 中,被排除(以 ! 开头的模式)剔除的路径会显示该排除项。在 gitignore 中显示忽略它的规则。
为什么 * 不匹配以点开头的文件?
除非模式写明了点,否则 glob 会跳过点文件。打开“包含点文件”后,* 和 ? 就能匹配它们,如同 bash 的 dotglob。.gitignore 没有这个开关。
这个工具会把我的路径发送到别处吗?
不会。一切都在你的浏览器中完成。你输入的内容不会发送到我们的服务器。