路径与忽略规则

Gitignore 测试器看清每一步判定

测试一份根目录 .gitignore 和候选路径;目录路径请以 / 结尾。

Gitignore 测试器

.gitignore 规则

候选路径

规则和候选字符串仅在此浏览器处理,不读取或修改仓库。

路径结果

请至少输入一条候选路径。

路径约定与范围

路径相对于这份 .gitignore 所在目录。使用 / 分隔,目录以 / 结尾。拒绝绝对路径、盘符、反斜杠、空路径段、. 和 ..;保留空格。

单份根目录 .gitignore,模拟未跟踪路径,按大小写敏感的 UTF-8 字节匹配。不读取子规则、全局排除、索引或文件系统。

最多 50 个物理规则行和 200 个非空候选行;每规则 256 字符、每路径 512 字符、最多 32 段。拒绝控制字符,后台运行超过 2 秒终止。

结果已过期或正在计算。

例外规则写对了文件名,却未必能让文件重新出现。Gitignore 测试器会指出真正挡住它的父目录:当整个 build/ 已被排除时,后面的 !build/keep.txt 无法恢复其中的文件。

做 Gitignore 在线测试时,除了应该忽略的路径,也放入一条必须保留的路径。逐行历史记录每个规则前缀的整体结果,帮助你发现顺序改变造成的影响,而不是只看一条通配符能否匹配。

为什么用 Gitignore 测试器检查例外规则

区分屏蔽目录与屏蔽内容

build/ 会把父目录一并排除,因此 !build/keep.txt 无法重新包含子文件。cache/* 只排除目录内的条目,后面的 !cache/keep.txt 则可以生效。Gitignore 测试器把父目录原因和决定行一起显示,避免把每条取反规则都误读为成功恢复。

关闭的父文件夹阻断所有子文件;打开的文件夹允许一个例外文件通过。

从行号追踪顺序变化

先忽略、再恢复、再忽略,同一路径可能经历三次变化。展开历史能查看每一物理行加入后的完整判定,包括注释和空行。记录中的决定行可能早于当前步骤;它说明当时由谁决定结果,不表示刚加入的那行一定命中了路径。

文件依次通过三个关卡,状态从排除变成保留,再回到排除。

准确复现一条路径的问题

01

先明确目录与相对位置

所有候选路径都相对于这份 .gitignore 所在目录。build/ 表示目录,build 表示文件。规则中的开头 / 用于根锚定,候选中的开头 / 则不合法。路径空格会保留,不会为了匹配而自动去掉。

02

沿着父目录找原因

若结果显示父目录被排除,先让父目录可访问,或者改用 cache/* 这类只排除内容的规则。展开路径历史,比较前后步骤的决定行。没有匹配的路径也会保留在表中,便于检查应当保留的对照样本。

03

需要逐次比较时关闭自动测试

默认编辑后停顿 350 毫秒执行。关闭自动测试后,点击测试规则或按 Ctrl/Cmd+Enter。编辑会立即使旧结果过期。示例和清空均先预览再应用,撤销同时恢复输入与结果;JSON 保存历史,TSV 适合查看摘要。

不仅判断是否匹配

按忽略规则解释通配符

使用 ignore 7.0.9 的公开接口处理 *、?、字符范围和 **,按大小写敏感的 UTF-8 字节匹配。因此 ? 代表一个字节,不等于一个完整汉字。不提供花括号展开、正则表达式或其他 shell 语法模式。

保留真实物理行号

注释和空行不改变行号。对于可访问的路径节点,最后一条命中规则决定忽略或恢复;即使两条正向规则内容相同,也显示最后命中的那行。父目录已被排除时,结果会说明继承的是哪条父规则。

导出不同粒度的报告

JSON 保留原路径、规则文本和所有前缀快照。TSV 汇总目录标记、忽略状态、决定行、规则及屏蔽父目录;类似公式的单元格会添加保护性单引号。即使页面只展示前 50 条,导出仍包含全部候选路径。

输入范围与实际仓库的区别

只模拟单份规则和未跟踪路径
Gitignore 测试器不读取仓库索引,也不合并子目录 .gitignore、.git/info/exclude、全局文件或命令行规则。这里的未忽略不等于已经跟踪,忽略也不会从真实索引中移除文件;文件是否存在、是否为符号链接同样不在判断范围内。
候选路径按原文判断
使用 / 分隔并以末尾 / 标记目录。绝对路径、Windows 路径、. 或 .. 路径段、控制字符和不完整 Unicode 会被拒绝。空候选行跳过,仅含空格的行则是文件名。规则中 # 开头为注释;字面的 # 或 ! 需要转义,未转义的行尾空格会被忽略。
明确限制和超时结果
最多 50 个物理规则行、200 个非空候选行;每规则 256 个、每路径 512 个 UTF-16 代码单元,路径最多 32 段。最后一个换行不额外计为规则行。后台任务超过 2 秒会终止,失败或已过期结果无法导出。
最终以真实仓库配置核对
固定大小写敏感,不能代表所有 Git 配置与命令的行为。必要时在仓库运行 git check-ignore -v 核对规则来源。没有命中当前样本的规则仍可能匹配其他文件,因此本工具不会认定它多余或自动删除它。 连续多星仅支持独占路径段的 **;***、a** 等形式不在模拟范围内,工具会明确拒绝,不表示 Git 本身不接受这些写法。

Gitignore 测试器常见问题

为什么写了 ! 规则,文件还是回不来?

父目录被排除后,Git 不会继续访问其中的文件。子文件的例外无法重新打开父目录。先恢复父目录,或者使用 build/* 排除内容,再添加具体例外。Gitignore 测试器会在结果中标出造成屏蔽的父路径。

build 和 /build 有什么区别?

build 可以匹配任意深度的同名条目;/build 仅相对于这份 .gitignore 所在目录匹配。规则中间包含斜杠也会固定相对位置。把 build 和 src/build 同时放入候选,就能直接比较两种写法。

logs/ 会匹配名为 logs 的文件吗?

不会。末尾斜杠把规则限定为目录。候选 logs/ 按目录测试,logs 按普通文件测试。浏览器不读取文件系统,也不会根据其他候选路径推测这个条目的真实类型。

** 的三种形式究竟是什么意思?

开头 **/ 匹配任意深度;结尾 /** 匹配目录后代;a/**/b 可以匹配 a/b 以及中间有多层目录的路径。单个 * 和 ? 不跨越 /。匹配以 UTF-8 字节为单位,因此一个 ? 不能覆盖一个完整多字节字符。

规则看起来没错,为什么 Git 仍然显示文件被修改?

文件一旦已被 Git 跟踪,新增忽略规则不会自动改变它的跟踪状态。这里没有索引信息,只把候选视作未跟踪路径。请先在真实仓库核对文件是否已被跟踪,再判断测试结果与 git status 的差异。

有值得补充的路径案例?

核对下一次规则修改

用 Gitignore 测试器同时检查一个应忽略的路径和一个应保留的路径。调查例外失效时,也把父目录本身加入候选。

保存导出的历史供评审参考,再用真实仓库中的 Git 核对规则及索引状态。