CODEOWNERS变更路径归属
用用户选定的单份CODEOWNERS解析每个变更路径,保留最后有效匹配、所有声明所有者与明确的归属缺口。
- 1添加输入
- 2调整设置
- 3获取结果
工具输入和文件在当前浏览器处理,不会上传。
开始之前
无需访问GitHub即可按声明审阅者分组变更路径。请自行选择目标分支快照,检查被跳过的原始行,并区分主动清空所有者与没有规则匹配。
如何使用
- 选择目标CODEOWNERS快照,再逐行输入仓库相对变更路径。
- 核对跳过规则数、声明所有者、主动清空与未匹配路径。
- 下载带原文来源和全部所有者分组的完整JSON/CSV,再用于交接。
支持范围与限制
一份明确选定的UTF-8 CODEOWNERS文件或粘贴文本,最多2 MiB;逐行变更路径列表另最多2 MiB。不自动判断.github、根目录、docs的优先位置或拉取请求基准分支。
最多10,000规则行、10,000路径;每个模式/路径最多1,024个UTF-16单元,每条规则最多100个所有者。有效规则数×输入路径数不得超过2,000,000;完整JSON与CSV合计最多32 MiB。所有限制同时适用。
按大小写敏感的GitHub模式处理*、?、独立路径段**、根路径与目录模式;最后有效匹配行生效。同一行多个所有者全部保留,空所有者列表主动清空归属,重复路径按原顺序保留。用户、团队和邮箱仅为声明,不核验账号存在、权限或实际审阅请求。
GitHub无效的否定、字符范围与反斜杠转义开头#规则会跳过,并保留完整原行、理由和UTF-8字节偏移。合法但暂不支持的转义模式(包括转义空格)整批返回不支持;绝对路径、反斜杠、点点段、控制字符和歧义空路径段拒绝。所有文本仅作为数据。
完整报告包含原文与哈希、有效/无效规则、全部输入路径和所有者分组。表格预览200行,长单元格裁至2,000个UTF-16单元;报告超过20,000字符时复制明确为预览,完整下载保留所有记录。取消或错误不交付部分归属。
操作示例
示例输入
# Explicitly selected CODEOWNERS snapshot * @general @org/reviewers *.js @javascript # Same-line owners replace earlier owners /docs/* [email protected] /apps/ @apps /apps/github !legacy @ignored
示例参数
{"secondary":"src/app.js\ndocs/readme.md\ndocs/deep/readme.md\napps/github/action.yml\nREADME.md\nsrc/app.js\n","params":{"spreadsheetSafe":true}}示例输出
{"format":"GitHub-CODEOWNERS-explicit-snapshot-routing","summary":{"paths":6,"validRules":5,"invalidRules":1,"declaredOwners":4,"matchedPaths":5,"explicitlyUnowned":1,"unmatchedPaths":0,"pairWork":30,"evaluatedPairs":18,"status":"declared-routing-with-skipped-lines"},"source":{"name":"pasted.txt","bytes":202,"sha256":"15e24081c2e8ebf417920dc5806d570ea7e3b0b2289fbbe1f852bd2f27bf3f36","text":"# Explicitly selected CODEOWNERS snapshot\r\n* @general @org/reviewers\r\n*.js @javascript # Same-line owners replace earlier owners\r\n/docs/* [email protected]\r\n/apps/ @apps\r\n/apps/github\r\n!legacy @ignored\r\n"},"changedPaths":{"bytes":90,"sha256":"fdf606604efda531d80a2c4110ec1d168377aa5063c58ae073d8321dbdc2f6a3","text":"src/app.js\ndocs/readme.md\ndocs/deep/readme.md\napps/github/action.yml\nREADME.md\nsrc/app.js\n"},"rules":[{"line":2,"byteOffset":43,"raw":"* @general @org/reviewers","pattern":"*","owners":["@general","@org/reviewers"]},{"line":3,"byteOffset":70,"raw":"*.js @javascript # Same-line owners replace earlier owners","pattern":"*.js","owners":["@javascript"]},{"line":4,"byteOffset":130,"raw":"/docs/* [email protected]","pattern":"/docs/*","owners":["[email protected]"]},{"line":5,"byteOffset":156,"raw":"/apps/ @apps","pattern":"/apps/","owners":["@apps"]},{"line":6,"byteOffset":170,"raw":"/apps/github","pattern":"/apps/github","owners":[]}],"invalidRules":[{"line":7,"byteOffset":184,"raw":"!legacy @ignored","reason":"GitHub-invalid-negation"}],"routing":[{"index":1,"path":"src/app.js","inputLine":1,"line":3,"pattern":"*.js","owners":["@javascript"],"status":"declared-owners","accountPermissions":"not-verified"},{"index":2,"path":"docs/readme.md","inputLine":2,"line":4,"pattern":"/docs/*","owners":["[email protected]"],"status":"declared-owners","accountPermissions":"not-verified"},{"index":3,"path":"docs/deep/readme.md","inputLine":3,"line":2,"pattern":"*","owners":["@general","@org/reviewers"],"status":"declared-owners","accountPermissions":"not-verified"},{"index":4,"path":"apps/github/action.yml","inputLine":4,"line":6,"pattern":"/apps/github","owners":[],"status":"explicitly-unowned","accountPermissions":"not-verified"},{"index":5,"path":"README.md","inputLine":5,"line":2,"pattern":"*","owners":["@general","@org/reviewers"],"status":"declared-owners","accountPermissions":"not-verified"},{"index":6,"path":"src/app.js","inputLine":6,"line":3,"pattern":"*.js","owners":["@javascript"],"status":"declared-owners","accountPermissions":"not-verified"}],"ownerGroups":[{"owner":"@javascript","pathIndexes":[1,6]},{"owner":"[email protected]","pathIndexes":[2]},{"owner":"@general","pathIndexes":[3,5]},{"owner":"@org/reviewers","pathIndexes":[3,5]}],"scope":"Case-sensitive last valid matching line from one user-selected snapshot only. Original source includes every blank/comment/rule line; invalid rules have full original lines and byte offsets. Duplicate supplied paths remain in input order. GitHub existence/write/team visibility and actual review requests are not verified; no repository, filesystem or network access. Valid escaped patterns and unsupported legal grammar fail atomically."}出现问题时
修正路径语法或选定目标快照;检查每条被跳过的规则。对不支持的转义语法,请明确决定重导出或删除后再运行;规则与路径组合或完整报告超限时缩小输入,不交付部分结果。
常见问题
能确定GitHub实际会请求哪些审阅者吗?
本工具只读取所选快照的声明;无法核验拉取请求基准分支、账号存在、写入权限或团队可见性。这些条件不满足时GitHub可能不分配所有者。
为何没有所有者的后续规则会覆盖前一条?
空所有者列表是明确清空规则。报告区分主动无所有者与未匹配,并保留最后清空规则的来源行。
docs/*包含docs/deep/readme.md吗?
不包含。该模式只匹配直接子项,/docs/覆盖后代路径。匹配大小写敏感,每个路径都保留最终来源模式。