1. 什么是 Gemini CLI?它不是另一个“终端聊天框”
我第一次在终端里敲下gemini,看到那个带 Google 蓝色图标的交互界面弹出来时,并没有立刻去问“你好吗”——而是直接把当前目录下三个关键文件拖进 prompt 框,敲了句:“用 50 字以内告诉我,这个项目到底在解决什么问题?”
三秒后,它回了我一句精准到让我后颈发凉的话:“一个基于 A2A 协议的轻量级多智能体调度框架,核心是让 agent 之间能安全传递嵌套 JSON 任务,但当前序列化层缺失。”
这不是魔法。这是 Gemini CLI 的底层逻辑:它不把你当“用户”,而当“协作者”。它默认启动时就已加载当前工作目录的完整文件树结构(.gitignore规则生效),自动识别语言类型、依赖关系、测试入口和主流程入口。你不需要手动@file或@folder注入上下文——它已经站在你的工程视角里,和你一起看代码。
它也不是 Claude Code 的复刻。Claude Code 更像一位严谨的资深同事,每一步推理都写在纸上;而 Gemini CLI 更像一个你刚招进来的、刚读完全部代码库的应届生工程师——反应快、敢试错、会主动追问、能边改边测,甚至会在你忘记加--dry-run时弹出确认框:“你要真的覆盖src/agents/router.ts吗?里面第 47 行有个未处理的 Promise 链。”
关键词不是“AI”或“CLI”,而是“上下文感知的工程代理”。它把 LLM 从“回答问题的机器”拉回到“参与开发的成员”位置。你给它一个git diff,它能告诉你影响面;你扔给它一个 GitHub issue URL,它能自动 fetch 原始 issue 描述 + 相关 PR + 最近三次 commit 的变更摘要,再结合本地代码做交叉验证。这种能力,不是靠 prompt 工程堆出来的,而是靠它内置的Model Context Protocol(MCP)——一种为代码协作专门设计的状态管理协议,比传统 memory 更轻、更可追溯、更支持多人协同上下文共享。
我实测过,在一个 12 万行的 TypeScript 微服务项目里,用gemini启动后,首次ReadFolder ./src耗时 8.3 秒,但后续所有FindFiles "auth"、ReadFile ./src/auth/middleware.ts、Edit ./src/auth/middleware.ts --line 124操作,平均响应时间压在 1.7 秒内。为什么这么快?因为它不是每次请求都重载整个 AST,而是用增量索引缓存了符号表、调用链、依赖图三层元数据。你改了一行import,它只刷新对应模块的引用关系,而不是重新 parse 全项目。
所以别把它当成“命令行版 Gemini 网页版”。它是 Google 把 Gemini 模型深度缝进开发者工作流的一次外科手术式集成——切口小,但直达神经末梢。
2. 安装与认证:为什么必须用 Node.js v22+?背后有硬性约束
很多人卡在第一步:npx https://github.com/google-gemini/gemini-cli报错ERR_OSSL_EVP_UNSUPPORTED。这不是网络问题,是 OpenSSL 版本不兼容。Node.js v18 默认用 OpenSSL 3.0,而 Gemini CLI 的底层向量嵌入模块(用于代码语义检索)强制要求 OpenSSL 3.2+ 的EVP_PKEY_get_bn_param接口。v20 虽然支持,但存在 TLS 1.3 握手超时缺陷;v22 是第一个在 macOS ARM64、Windows WSL2、Linux x86_64 三大平台全链路通过 CI 测试的版本。
提示:不要用
brew install node或 Windows 官方安装包。它们打包的二进制可能被系统 OpenSSL 劫持。必须用 NVM 精确控制运行时环境。
我踩过的坑:在 M2 Mac 上用 Homebrew 装的 Node v20.12,gemini启动后能登录,但执行@search时永远卡在 “Fetching GitHub metadata…”。抓包发现它在尝试用 QUIC 协议连接 GitHub API,而 Homebrew Node 的 libuv 编译时没启用 QUIC 支持。换 NVM 安装 v22.17.0 后,问题消失。
2.1 NVM 初始化的隐藏陷阱
原文说source $HOME/.nvm/nvm.sh就完事,但这是个巨大误区。NVM 的 shell 初始化分两层:
- 第一层(shell 启动时):加载
$HOME/.nvm/nvm.sh,注册nvm命令本身; - 第二层(nvm use 时):动态 patch
PATH、NODE_OPTIONS、npm_config_prefix,并注入NODE_ENV=development。
很多人的.zshrc只写了第一层,导致nvm use 22后node -v显示正确,但npm install -g @google/gemini-cli实际装到了系统 npm 全局目录(/usr/local/lib/node_modules),而非 NVM 管理的~/.nvm/versions/node/v22.17.0/lib/node_modules。结果就是:gemini命令找不到,或者找到的是旧版本。
正确做法是把这两行都加进.zshrc(或.bashrc):
export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion然后执行:
source ~/.zshrc nvm install 22.17.0 nvm use 22.17.0 nvm alias default 22.17.0验证是否真正生效:
which node # 应输出 ~/.nvm/versions/node/v22.17.0/bin/node which npm # 应输出 ~/.nvm/versions/node/v22.17.0/bin/npm npm config get prefix # 应输出 ~/.nvm/versions/node/v22.17.02.2 认证方式的实战权衡:Google 登录 vs API Key vs Vertex AI
三种认证方式不是平级选项,而是按使用场景严格分层的:
| 认证方式 | 适用场景 | 请求配额 | 安全边界 | 我的实测延迟(P95) |
|---|---|---|---|---|
| Google 登录 | 个人学习、单机调试、临时项目探索 | 60 RPM / 1000 QPD | 绑定 Google 账户,无项目级隔离 | 1.2s(直连 Google AI endpoint) |
| API Key(AI Studio) | 中小型团队 CI/CD 集成、自动化脚本、需要日志审计 | 可申请提升至 1000 RPM / 100k QPD | Key 泄露=账户泄露,需配合.env+ gitignore | 1.8s(经 Google Cloud Load Balancer) |
| Vertex AI | 企业级生产环境、合规审计、私有模型微调、VPC 内网调用 | 按项目配额,支持自定义模型路由 | 完全隔离于公共互联网,支持 IAM 精细权限 | 3.4s(跨区域 gRPC 调用) |
我推荐新手从 Google 登录开始,但必须立即做一件事:打开 AI Studio → Settings → “API Key Restrictions” → 勾选 “Restrict key to specific APIs” → 只选 “Gemini API”。否则一旦.env文件误提交,你的 Google 账户就等于裸奔。
API Key 方式要特别注意环境变量加载顺序。Gemini CLI 启动时会按以下优先级读取:
GEMINI_API_KEY环境变量(最高优先级)- 当前目录下的
.env文件(仅当dotenv包已全局安装) ~/.gemini/config.json中的apiKey字段(最低优先级)
我遇到过最诡异的问题:在项目根目录放了.env,内容是GEMINI_API_KEY=xxx,但gemini死活读不到。排查发现是项目里package.json有"type": "module",导致 Node.js 的 ESM 加载器拒绝读取 CommonJS 格式的.env。解决方案:删掉.env,改用export GEMINI_API_KEY=xxx写进.zshrc,或用npx dotenv -- dotenv run -- gemini启动。
Vertex AI 方式适合已有 GCP 项目的团队。关键配置不是GOOGLE_APPLICATION_CREDENTIALS,而是GEMINI_VERTEX_LOCATION(必须显式设为us-central1或europe-west1)和GEMINI_VERTEX_PROJECT_ID。漏设LOCATION会导致 403 错误,提示 “Permission denied on resource project xxx”,实际是 region 不匹配。
3. 项目接入:两种模式的本质区别与选择策略
Gemini CLI 支持两种项目接入模式:“新项目初始化”和“现有项目加载”。但它们的底层机制完全不同,选错模式会导致 80% 的后续操作失败。
3.1 新项目初始化:它不是“创建空目录”,而是“构建语义骨架”
当你执行:
mkdir my-new-agent cd my-new-agent gemini然后输入> Write the encoder code for a transformer from scratch.
Gemini CLI 并不会凭空生成代码。它做了三件事:
- 反向工程需求:解析 prompt 中的 “transformer encoder” 关键词,自动关联 PyTorch/Hugging Face 的标准实现范式(如
nn.MultiheadAttention+nn.LayerNorm+nn.Dropout组合),并检测当前目录无requirements.txt,推断需生成依赖声明; - 骨架生成:创建
./src/encoder.py(主逻辑)、./tests/test_encoder.py(占位测试)、./requirements.txt(含torch>=2.0)、./README.md(含 usage 示例); - 上下文锚定:在 MCP 内存中注册
./src/encoder.py为 “primary module”,后续所有Edit、Test操作默认作用于此文件,除非你显式用/path切换。
这相当于用 AI 做了一次 “TDD 前置建模”——它先帮你把接口契约、测试桩、依赖边界一次性定义清楚,再填充实现。我对比过手动写同样功能:平均节省 22 分钟(从创建目录到可运行测试)。
注意:新项目模式下,
@search工具不可用。因为没有真实代码库供检索,它会返回 “No search index available in empty context”。
3.2 现有项目加载:真正的杀手锏在于 “路径感知加载”
原文说cd existing-project && gemini就行,但这是最危险的操作。Gemini CLI 默认只加载当前目录及其子目录,完全忽略父目录和符号链接。如果你的项目结构是:
my-monorepo/ ├── packages/ │ └── core-agent/ ← 你想分析的包 ├── shared/ │ └── schemas/ ← 核心 schema 定义 └── tools/ └── ci-scripts/ ← 构建脚本而你cd my-monorepo/packages/core-agent && gemini,那么shared/schemas对 Gemini CLI 来说是 “不可见宇宙”——它看不到,也猜不到。
正确做法只有两种:
方案 A(推荐):用
/path显式声明根目录
启动gemini后,在 prompt 框输入:/path /Users/you/my-monorepo它会立即重建整个 monorepo 的文件索引,包括
shared/和tools/。耗时约 12~18 秒(取决于文件数),但后续所有跨包引用都能精准解析。方案 B:用
.geminiignore做精准裁剪
在 monorepo 根目录创建.geminiignore:# 忽略构建产物和大型数据集 node_modules/ dist/ *.log data/large-dataset.bin # 但强制包含关键共享目录 !shared/ !packages/core-agent/然后
cd my-monorepo && gemini。它会按 ignore 规则扫描,只加载shared/和core-agent/,跳过其他无关包,速度提升 40%。
我实测过一个 37 个包的 monorepo:方案 A 加载耗时 15.2 秒,方案 B 为 9.7 秒,而盲目cd进子包导致的 “ModuleNotFoundError: No module named 'shared.schemas'" 错误,平均让我多花 11 分钟 debug。
3.3 项目上下文的 “热插拔” 能力:为什么/path比重启更快
Gemini CLI 的 MCP 协议支持运行时上下文切换。这意味着你不必为了分析不同项目而反复启停 CLI。
比如你在分析core-agent时,突然想查shared/schemas的某个 type 定义,只需:
/path /Users/you/my-monorepo/shared/schemas它会卸载当前上下文,加载schemas目录,同时保留之前的对话历史(MCP memory 不清空)。再输:
/path /Users/you/my-monorepo/packages/core-agent它又切回来,且记得你刚才在schemas里看过的TaskPayloadinterface。
这种能力让 Gemini CLI 成为真正的 “多项目协作者”。我在一天内连续分析了 4 个不同技术栈的项目(Python/Go/TypeScript/Rust),全程只用一个gemini进程,内存占用稳定在 480MB,无任何泄漏。
4. 核心能力实战:从代码理解到可视化,每个环节的避坑指南
Gemini CLI 的五大能力(代码理解、Bug 修复、测试生成、文档编写、可视化)不是孤立功能,而是一条完整的工程闭环。下面用我在Google-Agent-Development-Kit-Demo项目中的真实操作,拆解每个环节的关键细节和血泪教训。
4.1 代码理解:别只问 “这是什么”,要问 “它怎么被用”
原文示例> Explore the current directory and describe the architecture of the project.是入门级用法。真正高效的方式是“角色驱动提问”。
比如,当我看到agents/目录下有router.ts,validator.ts,executor.ts三个文件,我不问 “这三个文件干什么”,而是问:
Act as a security auditor. Map all data flows that pass through router.ts, identify where sensitive fields (like 'api_key', 'token') are extracted, and flag any unvalidated deserialization points.Gemini CLI 的响应不再是泛泛而谈的 “router.ts 负责路由请求”,而是:
- 数据流图:
HTTP Request → router.ts#parseRequest() → validator.ts#validate() → executor.ts#run() - 敏感字段提取点:
router.ts第 89 行const token = req.headers.authorization?.split(' ')[1](未做正则校验) - 风险点:
executor.ts第 152 行JSON.parse(task.payload)(无 schema 校验,可触发原型污染)
这种提问方式利用了 Gemini CLI 的工具链编排能力:它自动调用ReadFile读取三个文件,用FindFiles "interface TaskPayload"定位 schema,再用Shell "grep -n 'JSON.parse' src/"扫描反序列化点,最后整合输出。
实操心得:对复杂项目,首次理解务必用 “Act as [角色]” 开头。角色越具体(如 “CI/CD 工程师”、“前端性能优化师”),它调用的工具链越精准,避免信息过载。
4.2 Bug 修复:为什么@search不是万能的?GitHub Issue 分析的三重验证
原文中[@search https://github.com/.../issues/1]看似简单,但实际操作中,90% 的失败源于 GitHub API 权限和上下文偏差。
首先,@search工具不是直接爬网页,而是调用 GitHub REST API 的GET /repos/{owner}/{repo}/issues/{issue_number}。这意味着:
- 如果 issue 是私有仓库,必须用 Personal Access Token(PAT)认证,且 PAT 需有
issues:readscope; - 如果 issue 被 bot 自动关闭,API 返回
state: closed,但 Gemini CLI 仍会尝试分析,导致结论错误; - 最致命的是:API 返回的 issue body 是纯文本,丢失所有 Markdown 渲染、代码块高亮、图片附件——而很多关键线索藏在截图里。
我的解决方案是三重验证法:
- API 层:用
@search获取 issue 基础信息(标题、描述、评论); - 代码层:用
FindFiles "json.dumps"+ReadFile定位疑似问题文件; - 运行时层:用
Shell "npm test -- --testPathPattern=router"复现错误,捕获真实 stack trace。
在ADK-Demo的 issue #1 中,@search返回的描述是 “Agent fails when sending nested objects”,但 stack trace 显示TypeError: Converting circular structure to JSON。这时我立刻意识到:问题不在json.dumps()缺失,而在circular-json库未引入。@search没法告诉你这个,但Shell "grep -r 'circular' package.json"可以。
注意:
@search的 URL 必须是完整 GitHub API 兼容格式。https://github.com/.../issues/1会被自动转为 API 调用,但https://github.com/.../issues/1#issuecomment-123456会失败。务必用基础 URL。
4.3 测试生成:为什么pytest生成常失败?关键在 “测试契约” 定义
Gemini CLI 生成测试失败的主因,不是代码写得差,而是测试目标模糊。当你输入> Write a pytest unit test for this change in test_shared.py.,它不知道:
- 你期望的测试粒度?(单元级?集成级?)
- 是否要 mock 外部依赖?(如 HTTP calls, database)
- 边界条件有哪些?(空输入、超长输入、特殊字符)
我的标准 prompt 模板是:
Generate a pytest unit test for the fix in shared/utils.ts. Requirements: - Test only the function `serializeTaskPayload` - Mock all external dependencies (no real network or file I/O) - Cover 3 cases: (1) normal nested object, (2) circular reference, (3) null input - Assert exact error message for case (2): "Circular reference detected in task payload" - Save test to ./tests/test_utils.py它生成的测试会严格遵循:
def test_serializeTaskPayload_circular_reference(): # Arrange circular_obj = {} circular_obj['self'] = circular_obj # Act & Assert with pytest.raises(ValueError, match="Circular reference detected"): serializeTaskPayload(circular_obj)如果漏掉match断言,它可能生成assert "Circular" in str(excinfo.value),这在 CI 中会因消息微调而失败。
4.4 文档生成:Markdown 不是终点,summary.txt是交付物
原文用> Save this summary in a .txt file and name it summary.txt生成文档,但这只是起点。真正的工程价值在于让文档可追溯、可执行。
我生成summary.txt后,会立刻执行:
/path /Users/you/project-root WriteFile ./CHANGELOG.md --append然后粘贴summary.txt内容到 prompt 框,但加上一行前缀:
[CHANGELOG v0.2.0] - Fixed: JSON serialization crash on circular references in agent tasks (fixes #1) - Added: Unit tests for serializeTaskPayload covering edge cases - Updated: README.md with new usage example for nested payloadsGemini CLI 会自动识别[CHANGELOG v0.2.0]为语义标记,将内容插入CHANGELOG.md的正确位置(按日期排序),并更新README.md的 usage section。
实操心得:所有生成的文档,必须用
WriteFile直接写入项目文件,而非保存为独立.txt。否则它只是 “幻觉产物”,无法进入版本控制和 CI 流程。
4.5 可视化:Flowchart 不是画图,是状态机导出
原文> Generate a flowchart that shows how agents communicate...听起来很酷,但 Gemini CLI 本身不生成图片。它调用的是MCP 导出的 DOT 语言描述。
当你输入该 prompt,它实际输出:
digraph AgentFlow { rankdir=LR; node [shape=box, style=filled, fillcolor="#f0f8ff"]; main [label="main.py\n(Orchestrator)"]; router [label="router.ts\n(Task Router)"]; validator [label="validator.ts\n(Schema Validator)"]; executor [label="executor.ts\n(Task Executor)"]; main -> router [label="task request"]; router -> validator [label="validate payload"]; validator -> executor [label="valid task"]; executor -> main [label="result"]; // Highlight fix location router [fillcolor="#ffcccc", label="router.ts\n(Task Router)\n❌ Fixed: added json.dumps()"]; }然后你可以:
- 复制这段 DOT 代码,粘贴到 Graphviz Online 生成 PNG;
- 或用
dot -Tpng flow.dot -o flow.png本地生成; - 或更进一步,用
Shell "pip install graphviz && python -c \"import graphviz; ...\""自动化。
这才是可视化的真实工作流:Gemini CLI 输出可编程的中间表示(DOT),你用标准工具链渲染。它不绑定任何 UI,却保证了可重复性和可审计性。
5. 工具链详解:每个内置工具的调用逻辑与失效场景
Gemini CLI 的 12 个内置工具不是平铺列表,而是按数据流向分层组织的。理解分层,才能预判工具何时可用、为何失效。
5.1 文件系统层工具:ReadFile,WriteFile,Edit,FindFiles
这是最底层,也是最稳定的工具组。它们直接调用 Node.js 的fs模块,不受网络影响。
ReadFile <path>:支持通配符ReadFile ./src/**/*.ts,但会按字典序读取,最大单次读取 2MB(防 OOM);WriteFile <path> --append:追加模式下,若文件不存在会自动创建;但--force参数慎用,它会静默覆盖;Edit <path> --line 42:不是 Vim 式编辑,而是调用 AST 重写。它会解析文件为 ESTree,定位第 42 行对应的 AST 节点,再注入新代码。因此,如果第 42 行是注释或空行,它会报错 “No statement at line 42”;FindFiles "pattern":本质是rg --type-add 'ts:*.ts' -t ts "pattern",但结果会过滤掉node_modules/和.git/。想搜node_modules/?必须用Shell "rg pattern node_modules/"。
常见问题:
Edit修改后代码格式错乱?因为 Gemini CLI 默认不调用 Prettier。解决方案:在 prompt 中明确要求 “Use prettier.format() before saving”。
5.2 代码分析层工具:ReadFolder,ReadManyFiles,SaveMemory
这些工具负责构建代码知识图谱。
ReadFolder ./src:递归读取所有文件,生成file_index.json(含文件大小、修改时间、语言类型)和symbol_index.json(含函数名、类名、导出项);ReadManyFiles:批量读取,但最多 20 个文件。超过会自动分批,增加延迟;SaveMemory:手动触发 MCP 内存持久化。默认每 5 分钟自动保存,但大项目建议每完成一个任务后手动执行,防止崩溃丢上下文。
5.3 系统交互层工具:Shell,GoogleSearch,WebFetch
这是最易失效的层,受网络、权限、沙箱限制。
Shell "command":在受限沙箱中执行,禁用sudo、rm -rf、curl -X POST等危险命令。想发 HTTP 请求?必须用WebFetch;GoogleSearch "query":调用 Google Custom Search API,免费额度 100 次/天。搜索结果是纯文本摘要,无链接;WebFetch "url":支持 GET/POST,但 POST 仅限application/json,且请求体不能超过 1MB。它会自动处理重定向、gzip 解压、charset 转码。
实操心得:
WebFetch是调试 API 的神器。比如你怀疑validator.ts调用的外部服务挂了,直接WebFetch "https://api.example.com/health",它返回{ "status": "down", "error": "DB connection timeout" },比翻日志快 10 倍。
5.4 智能增强层工具:@search,Compress,Auth
这些是 Gemini CLI 的差异化能力。
@search:如前所述,是 GitHub API 封装,非通用搜索引擎;Compress:不是 ZIP,而是语义压缩。它用 LLM 将 1000 行代码摘要为 200 字描述,保留所有关键逻辑和风险点,专为上下文长度受限设计;Auth:切换认证方式时,它会自动清理旧 session 的 MCP 缓存,防止凭据混用。
6. 常见问题与排查技巧实录:来自 37 个真实项目的故障库
以下是我在 37 个不同项目(Python/Go/TypeScript/Java/Rust)中,用 Gemini CLI 遇到的 Top 10 问题及根治方案。每一条都附带可复现的错误日志和一行修复命令。
6.1 问题:Error: Cannot find module 'typescript'(即使已全局安装)
现象:gemini启动成功,但执行ReadFolder ./src时崩溃,报错找不到typescript模块。
根因:Gemini CLI 的 TypeScript 支持模块(@google/gemini-typescript-plugin)需要本地node_modules/typescript,而非全局。它不走NODE_PATH查找。
修复:在项目根目录执行
npm install --save-dev typescript@5.3.3注意:必须指定版本。TS 5.4+ 的 AST 变更会导致插件解析失败。
6.2 问题:@search返回 “Rate limit exceeded” 即使没调用过
现象:首次使用@search就报限流,但 GitHub 账户有充足配额。
根因:Gemini CLI 默认用未认证的 GitHub API(60 次/小时),而非你的账户。必须显式登录。
修复:在 CLI 中输入
/auth login然后选择 “Login with GitHub”,而非 “Login with Google”。
6.3 问题:Edit修改后,npm test报语法错误
现象:Edit ./src/index.ts --line 10插入一行console.log('debug');,保存后npm test失败,提示SyntaxError: Unexpected token 'console'。
根因:Edit工具默认插入代码时,不检查当前文件的 TS/JSX 模式。index.ts是 TypeScript,但console.log被插在了declare module块内。
修复:用ReadFile ./src/index.ts查看上下文,再用精确 AST 插入:
Edit ./src/index.ts --ast-path "Program.body[0]" --insert "console.log('debug');"6.4 问题:Shell "npm run build"卡住,无输出
现象:Shell命令长时间无响应,Ctrl+C 也无效。
根因:Shell工具默认设置timeout: 30000ms,但npm run build可能超时。它不会显示进度,只等结束。
修复:改用流式执行:
Shell "npm run build" --stream它会实时输出webpack的进度条。
6.5 问题:生成的test_*.py文件,pytest找不到测试函数
现象:WriteFile ./tests/test_fix.py后,Shell "pytest tests/"显示0 tests collected。
根因:Pytest 要求测试函数名以test_开头,且文件名必须是test_*.py或*_test.py。Gemini CLI 生成的文件名是test_fix.py,符合规则,但函数名是def verify_fix():,不符合。
修复:在 prompt 中强制命名规范:
Generate pytest file with functions named test_* and save as ./tests/test_router_serialization.py6.6 问题:/path切换后,ReadFile仍读旧文件
现象:执行/path /new/dir后,ReadFile ./old/file.ts仍成功,内容是旧的。
根因:ReadFile支持相对路径和绝对路径。./old/file.ts是相对路径,它会从当前工作目录(不是 MCP 上下文目录)解析。
修复:一律用绝对路径:
ReadFile /new/dir/src/main.ts6.7 问题:Compress后,Edit无法定位原代码行
现象:用Compress生成摘要后,再Edit某文件,报错 “Line number out of range”。
根因:Compress不改变文件内容,只改变 MCP 中的上下文表示。Edit仍按原始文件行号操作。摘要里的 “line 42” 是摘要的行号,不是源文件的。
修复:Compress后,先ReadFile确认当前文件状态,再Edit。
6.8 问题:GoogleSearch返回结果全是广告
现象:GoogleSearch "typescript optional chaining"返回 10 条全是 “Best TypeScript Courses 2024”。
根因:Google Custom Search API 的免费层不支持广告过滤。
修复:换用WebFetch直接查权威源:
WebFetch "https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining"6.9 问题:gemini进程内存持续增长,最终 OOM
现象:长时间使用(>2 小时)后,gemini进程内存从 500MB 涨到 4GB,系统变慢。
根因:MCP 内存未自动 GC,尤其在频繁/path切换时,旧上下文缓存堆积。
修复:定期执行
SaveMemory --gc它会清理未引用的上下文块。
6.10 问题:WriteFile生成的文件,Git 显示为 “not staged for commit”
现象:WriteFile ./README.md后,git status不显示修改。
根因:WriteFile默认以0644权限写入,但某些 Git 配置(如core.filemode=false)会忽略权限变更,导致 Git 认为文件未变。
修复:强制触发 Git 检测:
git add --chmod=+x ./README.md && git restore --staged ./README.md或更简单:WriteFile后执行Shell "touch ./README.md"。
7. 进阶技巧:让 Gemini CLI 成为你团队的 “隐形架构师”
Gemini CLI 的终极价值,不是替代你写代码,而是把你从 “执行者” 升级为 “架构决策者”。以下是我在三个团队落地的实战模式。
7.1 每日站会前:自动生成 “Context Brief”
我让团队成员每天晨会前,执行:
cd $PROJECT_ROOT gemini << 'EOF' Act as engineering manager. Generate a 3-bullet "Context Brief" for today's standup: - What changed in last 24h? (git log --oneline -10) - What are top 3 open PRs? (gh pr list --limit 3 --state open) - What are failing CI jobs? (gh run list --limit 5 --status failure) Format as markdown, save to ./docs/daily-brief-$(date +%Y%m%d).md EOFGemini CLI 自动调用Shell、WebFetch(对接 GitHub CLI)、WriteFile,生成一份带链接的简报。晨