原创专题
GitHub Copilot 路径指令:用 applyTo 给不同目录写不同规则
在 .github/instructions 下按目录拆分指令文件,用 glob 限定适用范围,并在提交前检查路径是否被正确命中。
仓库级指令对所有文件生效,前端与后端的规则却常常不同。本文目标是为 src/web 下的 TypeScript 文件和 services 下的 Python 文件各建一个路径指令文件,并确认没有无意重叠。前提是你有仓库写权限,并使用官方页所说的 Copilot 云端 agent 或代码评审;用于代码评审时,还要确认仓库或个人设置里的自定义指令没有被关闭。这里依据官方页写出文件,并用本地 glob 引擎检查路径命中;没有提交到 GitHub,也没有触发 Copilot。
操作与验收顺序
拆分范围
先把规则按目录或语言分组,仓库级规则只留通用部分。[1]
写 applyTo
文件名以 .instructions.md 结尾,frontmatter 用 glob 限定范围,多个 glob 用逗号分隔。[1]
核对命中
用样例路径检查哪些文件会命中、是否重叠。[1]
先分清三类指令
官方页列出三类仓库指令:.github/copilot-instructions.md 对仓库内所有请求生效;.github/instructions 下的 NAME.instructions.md 只对匹配路径的文件生效;AGENTS.md 供 AI agent 使用,目录树里离当前文件最近的那份优先。路径指令命中时,若仓库级文件也存在,两边的内容都会使用。所以仓库级文件放通用约定,目录专属规则才写进路径文件。原创练习:web 规则只管 src/web 下的 .ts 和 .tsx,Python 规则只管 services 下的 .py。[1]
写两个路径指令文件
在 .github/instructions 下建两个文件,文件名必须以 .instructions.md 结尾,也可以再分子目录。web-ts.instructions.md 的 frontmatter 写 applyTo: "src/web/**/*.ts,src/web/**/*.tsx",多个 glob 用逗号分隔;python-services.instructions.md 写 applyTo: "services/**/*.py"。正文用普通 Markdown 写指令,例如“src/web 里使用具名导出”“公共函数加类型标注”。想让某个文件只给其中一个功能读取时,加 excludeAgent,取值只有 code-review 或 cloud-agent。[1]
用样例路径核对 glob
官方页的规则是:* 只匹配当前目录,** 匹配所有目录;src/*.py 能匹配 src/foo.py,但不匹配 src/foo/bar.py。别凭印象写 glob,列 8 条样例路径逐条核对,清单见下方。再加一个 applyTo 为 **/*.ts 的文件,src/web/ui/Button.test.ts 和 src/web/app.ts 这类 .ts 文件就会同时命中两份。官方页没有说明同类指令冲突时谁优先,所以不要让它们互相矛盾。[1]
- src/web/app.ts:命中 web
- src/web/ui/Button.tsx:命中 web
- src/web/ui/Button.test.ts:命中 web(.ts)
- services/billing/invoice.py:命中 Python
- services/main.py:命中 Python
- src/server/api.ts:不命中任何路径文件
- tools/gen.py:不命中任何路径文件
- tests/test_invoice.py:不命中任何路径文件
检查范围与停止条件
本地用两套 glob 实现(picomatch 与 Node 的 path.matchesGlob)核对了可由官方页 glob 说明推出的 19 个结果(另加 2 个逗号分隔用例)和上述 8 条练习路径,全部一致;frontmatter 也能被 YAML 解析。这只说明 glob 写法与页面描述一致,不证明 GitHub 的匹配引擎行为相同,也没有触发 Copilot。官方页说明 GitHub.com 上路径指令目前只支持 Copilot 云端 agent 和代码评审,代码评审读取 PR 头分支上的指令,可以在同一个 PR 里先试。若结果没有体现规则,先查路径、文件名和 frontmatter,不要继续加规则;路径指令的使用证据在哪里查看,页面没有写,按未验证处理。[1]
本文来源
本站原创整理;官方说明与编辑建议分别标注。