返回

.gitignore 规则测试

开发工具

正在载入

正在加载工具

工具代码会在打开时按需载入,请稍候。

本工具的全部运算都发生在你的浏览器中,输入内容不会发送到任何服务器。

关于这个工具

粘贴一份根目录 .gitignore 与每行一个的示例路径,即可在不打开仓库的情况下检查规则效果。结果区分被忽略、显式取消忽略、未命中规则和无效路径,并用规则行号解释判断,包括由父目录继承的排除结果。匹配使用固定版本 ignore 7.0.12,在浏览器本地按区分大小写的 UTF-8 字节语义运行。本工具不读取文件系统,也不执行 Git。

常见用途

  • 确认生成文件、日志与临时目录被排除,同时需要保留的例外文件仍可见。
  • 在修改共享的根目录 .gitignore 前,解释为何被忽略父目录下的 ! 例外规则没有生效。
  • 修改规则前后测试一小组有代表性的路径,并保存纯文本审查报告。

使用方法

  1. 1.粘贴根目录 .gitignore 规则,以及每行一个的根目录相对路径,或载入示例。使用 / 分隔路径;目录示例以 / 结尾,否则按文件处理。保留有意义的空格,不要给路径加引号。
  2. 2.运行测试,查看每条路径的状态与规则行依据。ignored 表示被排除;unignored 表示显式 ! 例外生效;unmatched 表示没有有效规则命中;invalid 表示路径未通过输入检查。子路径的结果可能由被排除的父目录决定。可按状态筛选以集中审查;每页显示 25 条路径。
  3. 3.复制或下载文本报告前先阅读隐私提示:报告包含原始路径与规则。修改任一输入后重新测试;输入或界面语言变更时,旧结果和报告会清空。

可执行的规则与路径示例

按顺序排除与显式例外

{
  "rules": "*.log\n!important.log\nprivate/*.log",
  "paths": "debug.log\nimportant.log\nprivate/important.log\nREADME.md"
}
{
  "statuses": [
    "ignored",
    "unignored",
    "ignored",
    "unmatched"
  ]
}

输出状态与示例路径顺序一致。important.log 被显式取消忽略,但后面的 private/*.log 再次排除了 private/important.log。README.md 未命中规则。JSON 输入展示两个文本字段,请把各字符串解码后的内容分别粘贴到对应输入框。

被排除的父目录阻止子文件例外

{
  "rules": "build/\n!build/keep.txt",
  "paths": "build/\nbuild/keep.txt\nbuild/output.js\nsrc/main.js"
}
{
  "statuses": [
    "ignored",
    "ignored",
    "ignored",
    "unmatched"
  ]
}

build/ 排除了父目录及其后代。后面的子文件例外不能重新开放父目录,因此 build/keep.txt 仍被忽略;src/main.js 未命中规则。父目录规则依据可以解释此结果,但不代表工具检查了真实文件。

根目录锚定与大小写敏感

{
  "rules": "/cache/\n*.tmp",
  "paths": "cache/\ncache/data.json\napp/cache/data.json\napp/draft.tmp\nDRAFT.TMP"
}
{
  "statuses": [
    "ignored",
    "ignored",
    "unmatched",
    "ignored",
    "unmatched"
  ]
}

/cache/ 只影响根目录 cache,不影响 app/cache。*.tmp 也能匹配下层路径,但 DRAFT.TMP 的大写扩展名不会命中区分大小写的小写规则。

用 ** 匹配零层或多层目录

{
  "rules": "docs/**/draft?.md",
  "paths": "docs/draft1.md\ndocs/a/b/draft2.md\ndocs/draft10.md\nother/docs/draft1.md"
}
{
  "statuses": [
    "ignored",
    "ignored",
    "unmatched",
    "unmatched"
  ]
}

独立 ** 路径段允许零层或多层中间目录。此处 ? 只匹配一个字节,因此 draft10.md 不符合文件名模式。规则内部的斜杠使整个模式相对于根目录下的 docs。

字面标记与保留尾随空格

{
  "rules": "# comment\n\\#draft\n\\!todo\nnote\\ ",
  "paths": "#draft\n!todo\nnote \nnote\n note"
}
{
  "statuses": [
    "ignored",
    "ignored",
    "ignored",
    "unmatched",
    "unmatched"
  ]
}

第一行是注释;转义后的 # 和 ! 匹配文件名的字面字符。note\ 后跟一个空格会匹配末尾有一个空格的 note。没有尾随空格的 note 与有前导空格的 note 都不匹配。JSON 便于核对有意义的空格与反斜杠。

目录查询不等同于文件查询

{
  "rules": "a/*",
  "paths": "a/\na\na/file.txt"
}
{
  "statuses": [
    "ignored",
    "unmatched",
    "ignored"
  ]
}

末尾斜杠声明这是目录查询。与 git check-ignore 一样,显式 a/ 可用空的最后一段命中 a/*;文件示例 a 则未命中。不要把该结果理解为目录遍历模拟。

通配符按 UTF-8 字节计数

{
  "rules": "x?y\nx??y",
  "paths": "xay\nxéy\nx😀y"
}
{
  "statuses": [
    "ignored",
    "ignored",
    "unmatched"
  ]
}

xay 命中 x?y。é 的 UTF-8 编码占两个字节,所以 xéy 命中 x??y。emoji 占四个字节,不命中这两条规则。输入长度上限另按 UTF-16 代码单元计算,与字节匹配语义不同。

拒绝有歧义或非相对路径

{
  "rules": "*.tmp",
  "paths": "/tmp/cache.tmp\nC:/cache.tmp\nsrc\\cache.tmp\n./cache.tmp\n../cache.tmp\nsrc//cache.tmp\nsrc/../cache.tmp\nsrc/cache.tmp"
}
{
  "statuses": [
    "invalid",
    "invalid",
    "invalid",
    "invalid",
    "invalid",
    "invalid",
    "invalid",
    "ignored"
  ]
}

绝对路径、盘符路径、反斜杠路径、点路径段和连续分隔符会标为无效,不会被悄悄规范化。最后一个根目录相对 POSIX 路径有效,且命中 *.tmp。无效行与有效但未命中的路径明确区分。

常见忽略规则测试错误

  • 把 shell 通配符、正则表达式或 Windows 反斜杠当作 .gitignore 路径语法。
  • 以为 !child/path 能重新开放被排除的父目录,或把 unmatched 误读为显式例外。
  • 裁剪示例路径空格、给路径加引号,或忘记用末尾 / 标识目录。
  • 以为 ? 统计可见 Unicode 字符,或用 ***、嵌入式 ** 代替独立的 ** 路径段。
  • 把被忽略结果当作已跟踪文件或秘密信息已删除的证明,或未经检查就分享未脱敏报告。

限制与说明

  • 仅计算粘贴的根目录 .gitignore,不读取嵌套 .gitignore、.git/info/exclude、全局忽略配置、仓库配置或已跟踪文件状态。被忽略的结果不能移除已跟踪文件,也不能证明 Git 历史中没有秘密信息。符号链接示例按文件处理,不跟随链接,也不遍历目录。
  • 路径采用区分大小写的 POSIX / 写法。绝对路径、盘符前缀、反斜杠、. 或 .. 路径段、内部空路径段、NUL、ASCII 控制字符与无效 Unicode 均拒绝接受。示例路径的首尾空格原样保留;空行跳过。支持 LF 和 CRLF。规则支持注释、转义的开头 # 或 !、否定规则、*、?、字符类和独立的 ** 路径段。*** 或不独占路径段的 ** 等有歧义写法会被拒绝,不进行猜测;规则中的 ASCII 控制字符与无效 Unicode 也不接受。
  • 规则文本上限为 32 KiB UTF-8 字节、200 个物理行,每行最多 256 个 UTF-16 代码单元。路径文本总上限为 32 KiB、100 个物理行,每条路径最多 512 个 UTF-16 代码单元。空行与规则注释均计入行数上限;末尾换行不另加一行。整体超限或不支持的规则会终止测试;单条无效路径会作为 invalid 行保留显示。 匹配另设 2,000,000 步运算上限。复杂规则与路径组合可能在未达输入大小上限前触发此限制;请减少输入后重试,不会保留部分结果。
  • 匹配按 UTF-8 字节而非显示字符数进行:é 需要两个 ?,许多表情符号需要四个。路径以 / 结尾表示类似 git check-ignore path/ 的目录查询,而非完整遍历:a/* 可匹配 a/ 本身,a/*/ 与 a/**/ 则要求后代目录。后面的子路径否定规则不能越过已排除的父目录,须先重新包含父目录。
  • 输入处理仅发生在已加载的浏览器页面内,计算时不访问仓库、文件系统或网络。纯文本报告包含未经秘密信息脱敏的原始路径与规则,也包括无效路径文本。无论当前筛选条件或页码如何,导出始终包含全部行;带引号的字符串保留空格并转义换行。复制、下载或分享前请检查项目名、私密文件名和凭据;已保存或复制的报告不再由页面控制。

常见问题

为什么 build/ 后面的 !build/keep.txt 没有生效?

父目录 build 已被排除,针对子文件的规则无法使它重新可达。要保留部分后代路径,应让相应父目录保持可访问,并用实际示例路径测试 build/* 后接 !build/keep.txt 等规则。后出现的否定规则不能无条件推翻父目录排除。

/cache、cache/ 与普通 cache 规则有什么区别?

开头的 / 将规则锚定到本次输入代表的根目录;末尾的 / 将规则限定为目录,目录示例也需要以 / 结尾。普通名称可以影响根目录下不同层级的文件或目录。显式目录查询有“限制”中说明的末尾斜杠行为,请同时测试目录及目标子路径。

为什么空格或开头的 #、! 会改变结果?

以 # 开头的规则是注释,以 ! 开头的是例外。要匹配这些字面字符,应在第一个字符前加反斜杠。规则末尾未转义的空格会被忽略,转义后的尾随空格则有意义。示例路径不做 trim:note、末尾有空格的 note 与开头有空格的 note 是不同输入。

显示 ignored 是否意味着 Git 会停止跟踪或保护该文件?

不会。本页只将文本规则应用于假设路径,不检查 Git 索引、不移除已跟踪文件、不为导出脱敏,也不审计历史。验证修改时仍需在自己的仓库中检查状态和忽略诊断;忽略规则不是秘密信息保护措施。

相关工具