Skip to content

Gemini CLI 支持在 GEMINI.md 中使用 @文件路径 语法将内容拆成多个小文件按需组合。Memory Import Processor 自动解析嵌套导入、检测循环引用、限制最大深度(默认 5 层),并对路径进行安全校验。出问题时可查看 /memory show 的导入树定位哪个文件未被加载。

Memory Import Processor(模块化导入)

GEMINI.md 文件变得很长时,可以用 @ 语法将内容分散到多个文件,再在主文件中按需引入。Memory Import Processor 负责在运行时将这些引用拼合成一份完整的上下文。

导入语法

在 GEMINI.md 中,每行以 @ 开头后接文件路径即为导入指令:

markdown
# 主 GEMINI.md

这是公共说明。

@./components/style-guide.md

@./components/testing-rules.md

代码块内的 @ 不会被解析:import 处理器会识别代码块(code 和反引号行内代码),跳过其中的 @ 行,不会误触发导入。

支持的路径格式

相对路径

格式含义
@./file.md当前目录下的文件
@../file.md上一级目录
@./sub/file.md子目录

绝对路径

格式含义
@/absolute/path/to/file.md绝对路径(需在允许目录内)

嵌套导入

被导入的文件本身也可以含有 @ 指令,形成树形结构:

markdown
# main.md
@./header.md
@./content.md
markdown
# header.md
@./shared/title.md

处理后,main.md 中的 @./header.md 会展开为 header.md 全文(其中 @./shared/title.md 也已递归展开)。

/memory show 会以树形视图显示完整的加载层次,便于调试:

Memory Files
 └ project: GEMINI.md
            ├ style-guide.md
            │  └ shared/base-styles.md
            └ testing-rules.md
               └ shared/jest-config.md

安全机制

循环导入检测

处理器维护一个"已访问文件集合",遇到已处理的文件路径时自动跳过:

markdown
# file-a.md
@./file-b.md

# file-b.md
@./file-a.md   ← 检测到循环,跳过此行,不会无限递归

最大导入深度

默认最大嵌套深度为 5 层,超出后停止继续深入展开,防止意外构建过深的导入链。

路径安全校验(validateImportPath

每条导入路径在解析前都经过 validateImportPath 检验:

  • 路径必须位于允许目录列表allowedDirectories)内
  • 禁止通过 ../../../ 等手段逃逸至配置范围之外
  • 不符合安全要求的路径会被静默跳过(或写入错误注释)

错误处理

错误类型行为
文件不存在在展开位置插入错误注释,不中断其余内容
权限不足输出错误提示,跳过该导入
路径越界安全校验失败,静默跳过
超过最大深度停止递归,已加载内容正常保留

/memory 命令与导入树

bash
/memory show     # 显示当前上下文全文(含所有已展开导入)
/memory reload   # 强制重新扫描并重载所有 GEMINI.md
/memory add <>  # 追加文本到 ~/.gemini/GEMINI.md

/memory show 输出中,头部会有类似上面的树状结构,显示每个文件的导入来源链,是排查"内容没有被加载"最直接的方法。

实用示例:项目级拆分

以下展示一个典型的大型项目 GEMINI.md 拆分方案:

~/.gemini/GEMINI.md(全局)

markdown
# 全局偏好

@./preferences/code-style.md
@./preferences/commit-message.md

项目根目录 GEMINI.md

markdown
# 项目:我的 TypeScript Monorepo

@./docs/architecture.md
@./docs/api-conventions.md

## 特殊说明

本项目使用 Bun 运行时,禁止 Node.js 特有 API。

docs/architecture.md

markdown
## 架构概述

采用 Hexagonal Architecture,核心业务逻辑不依赖任何框架。

@./shared/domain-models.md

这种分层结构的好处:

  • 各模块说明独立维护,互不干扰
  • 新成员可以按需阅读对应文件,不必理解全局
  • 全局偏好与项目规范分离,工作区切换时自动适配

与 Claude Code /memory 机制对比

特性Gemini CLI @importClaude Code CLAUDE.md
导入语法@./file.md无内置导入,通过 /memory add 追加
结构树形(可调试导入层次)平铺线性拼接
循环检测内置自动检测
最大深度默认 5 层
路径安全validateImportPath 检验
调试命令/memory show(含树视图)/memory 命令集

最佳实践

  1. 文件名有意义style-guide.mdtest-rules.mdpart1.md 更容易维护
  2. 保持浅层:建议不超过 3 层嵌套,5 层是上限不是目标
  3. 文档化结构:在主 GEMINI.md 顶部注释说明每个 @import 的用途
  4. 相对路径优先:绝对路径在跨机器同步时容易失效
  5. 先验证再部署:新增导入后用 /memory show 确认内容已正确展开

常见问题

Q: @ 导入后内容没有出现在 /memory show 里,怎么排查?

A: 按顺序检查:① 文件路径是否拼写正确,cat 确认文件存在;② 路径是否在允许目录内(validateImportPath 校验);③ 是否超过了 5 层最大深度限制;④ 是否形成循环引用被跳过。运行 /memory show 查看树形输出,找到首个断开的节点。

Q: 可以在 @import 里使用环境变量或通配符吗?

A: 不支持。路径必须是字面字符串(相对或绝对),不支持 glob 模式(@./*.md)和变量展开(@$HOME/rules.md)。如需动态引入,需在外部脚本中生成主 GEMINI.md 再让 CLI 读取。

Q: 如果被导入的文件很大,会影响 Token 用量吗?

A: 会。所有展开后的内容都会作为系统上下文随每次请求发送,Token 用量与最终拼合文本的长度成正比。建议定期用 /memory show 检查上下文大小,删除不再需要的导入。