用 Claude Code 重构代码库,它把 .git 文件夹删了一半——TaoToken 权限配置血的教训
1. 当 Claude Code 重构代码库时.git 文件夹为什么会被删掉一半先说结论Claude Code 本身不会无缘无故去删.git它删.git通常是因为你在重构任务里给了它一个模糊的指令而它把「清理仓库状态」当成了重构的一部分。我遇到的那次是让它把一个 6 万行的 React 项目从旧架构迁移到新编译器架构任务描述里写了「清理无用文件和过时配置」结果它在执行git clean -fd和git reset --hard的组合操作时把.git/refs和.git/objects里的一部分内容当成了「可清理的临时文件」。这个问题的核心不是 Claude Code 有 bug而是它的权限边界默认太宽。Claude Code 是一个终端原生的 Agent它能直接调用 Bash、Read、Edit 这些工具默认配置下它和你在终端里的权限几乎一样。你在终端里能rm -rf它也能。区别在于你在删之前会犹豫它不会。我试过在.claude/settings.json里只写allow规则结果发现allow是白名单机制没写进去的操作默认会弹确认框。但问题在于很多人在初始化项目时直接选了「允许所有操作」或者用了bypassPermissions模式这时候 Claude Code 就进入了所谓的 YOLO 模式——它执行任何命令都不再问你。.git文件夹被删一半的触发路径通常是这样的你让它重构某个模块它发现当前分支有未提交的改动于是决定先「清理工作区」。它执行了git clean -fd这个命令会删除所有未跟踪的文件和目录。如果你的.git目录里有未跟踪的临时文件比如.git/refs/heads下的某些引用文件它们就会被删掉。更严重的是如果它接着执行git reset --hard你的工作区改动会全部丢失而.git里的索引和对象数据库可能因为并发操作而损坏。这里的关键点是Claude Code 的权限配置里Bash(git clean:*)和Bash(git reset --hard:*)默认不在 deny 列表里。你需要手动把它们加进去。而且deny规则的优先级高于allow一旦设置任何命令行标志都无法绕过。还有一个容易被忽略的点Claude Code 会读取项目根目录的CLAUDE.md文件作为持久上下文。如果你在CLAUDE.md里写了「重构时请保持仓库整洁」它可能会把这句话理解为「可以执行清理命令」。所以CLAUDE.md里必须明确写出禁止操作而不是模糊的期望。我后来复盘发现那次事故的直接原因是.claude/settings.json里没有配置任何deny规则而allow列表里包含了Bash(git *)。这个通配符让 Claude Code 可以执行任何 git 命令包括git clean -fd和git reset --hard。修复方法很简单把Bash(git *)从allow里删掉改成只允许Bash(git status)、Bash(git diff)、Bash(git log *)这些只读命令。如果你现在正在用 Claude Code 做重构建议先检查一下你的.claude/settings.json里有没有Bash(git *)或者Bash(rm *)这样的通配符。有的话立刻改掉。这不是危言耸听我见过太多人在重构任务里被 AI 的「自主清理」坑过。2. TaoToken 统一 Key 通道的前置配置与权限隔离在讲具体的权限配置之前先说一下为什么要把 TaoToken 接进来。Claude Code 默认走的是 Anthropic 官方 API但如果你在国内做开发直连的稳定性和成本都是问题。TaoToken 提供的是一个统一的 API 通道你可以用同一个 Key 访问 Claude、GPT 等模型而且它的 Base URL 和 Anthropic 官方是兼容的。接入 TaoToken 的步骤不复杂但有几个关键点容易踩坑。首先你需要拿到一个 API Key。访问https://taotoken.net/api-keys这个 deep link登录后创建一个新的 Key。注意这个 Key 只在创建时显示一次复制后保存好。拿到 Key 之后你需要配置 Claude Code 的 API 端点。Claude Code 读取的是环境变量ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY。在终端里执行export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEY你的_TaoToken_Key如果你用的是 Windows PowerShell命令是$env:ANTHROPIC_BASE_URLhttps://taotoken.net/api $env:ANTHROPIC_API_KEY你的_TaoToken_Key但这里有一个权限隔离的问题环境变量是全局的Claude Code 能读到其他终端程序也能读到。如果你在共享服务器上开发建议把 Key 写进项目的.env文件然后用dotenv加载而不是直接 export。更安全的做法是使用 Claude Code 的settings.json来管理 API 配置。在~/.claude/settings.json里写入{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: 你的_TaoToken_Key } }这样配置的好处是Claude Code 启动时会自动加载这些环境变量而且不会污染你的 shell 会话。但要注意settings.json里的 Key 是明文存储的所以这个文件不能提交到 Git 仓库。你需要在.gitignore里加上.claude/settings.json。如果你用的是 Claude Code 的 Coding Plan 模式也就是长期编码任务建议把 Key 配置在~/.claude/settings.json里而不是项目级的.claude/settings.json。因为项目级的配置文件可能会被 Claude Code 在重构时修改或删除而用户级的配置更稳定。还有一个细节TaoToken 的 API 端点支持模型映射。你可以在请求里指定model参数比如claude-sonnet-4-20250514或者gpt-4o。Claude Code 默认会用它自己的模型选择逻辑但你可以通过ANTHROPIC_MODEL环境变量强制指定。比如export ANTHROPIC_MODELclaude-sonnet-4-20250514这样配置之后Claude Code 的所有请求都会走 TaoToken 的通道而且你可以用同一个 Key 切换不同的模型。对于重构任务来说建议用 Claude 系列的模型因为它在代码理解和多文件编辑上表现更稳。但这里有一个权限配置的坑如果你在settings.json里同时配置了env和permissionsClaude Code 会先加载env再应用permissions。这意味着如果permissions里没有 deny 掉Bash(env:*)Claude Code 可能会通过env命令读取到你的 API Key。虽然这个风险不高但为了安全建议在deny列表里加上Bash(env:*)和Bash(printenv:*)。另外TaoToken 的 API 通道支持请求日志和用量统计。你可以在https://taotoken.net/console里查看每个 Key 的调用记录。如果你发现 Claude Code 在重构时频繁调用 API但你没有看到对应的操作可能是它在后台执行了某些自动化任务。这时候你需要检查settings.json里的permissions配置确保没有允许Bash(curl:*)或Bash(wget:*)这样的网络请求命令。最后如果你在团队里共用 TaoToken 的 Key建议为每个开发者创建独立的 Key并在settings.json里配置不同的权限模板。这样即使某个开发者的 Claude Code 出了问题也不会影响到其他人的 Key 和配额。3. 可复制的权限白名单配置与 dry-run 验证动作这一节是全文的核心。我会给出一个可以直接复制的.claude/settings.json配置然后解释每个字段的作用最后给出一个删除前的 dry-run 验证脚本。先看配置文件。在你的项目根目录创建.claude/settings.json写入以下内容{ permissions: { deny: [ Bash(rm:*), Bash(rm -rf:*), Bash(rm -r:*), Bash(sudo:*), Bash(chmod 777:*), Bash(chown:*), Bash(dd:*), Bash(mkfs:*), Bash(git clean:*), Bash(git reset --hard:*), Bash(git push --force:*), Bash(git push -f:*), Bash(git checkout -- .), Bash(git restore .), Bash(env:*), Bash(printenv:*), Read(~/.ssh/**), Read(**/.env), Edit(**/.env), Edit(.git/**), Read(.git/**) ], allow: [ Bash(git status), Bash(git diff *), Bash(git log *), Bash(git branch), Bash(ls *), Bash(cat *), Bash(npm run *), Bash(npx tsc --noEmit), Bash(npx eslint *), Read(src/**), Edit(src/**), Read(package.json), Edit(package.json) ] } }这个配置的关键点在于deny列表里包含了所有可能破坏仓库的命令包括rm、git clean、git reset --hard、git push --force。同时Read(.git/**)和Edit(.git/**)也被 deny 了这样 Claude Code 连读.git目录的权限都没有更别说删了。allow列表里只放了只读命令和安全的构建命令。注意Bash(git diff *)后面的*是必须的因为git diff通常带参数。而Bash(git status)没有*因为git status一般不带参数。这个细节很重要如果写错了Claude Code 会频繁弹确认框。接下来是 dry-run 验证。在让 Claude Code 执行任何删除操作之前你可以先让它跑一个 dry-run 命令。比如如果你想清理未跟踪的文件不要直接让它执行git clean -fd而是先执行git clean -fdn-n参数表示 dry-run它只会列出会被删除的文件不会真正删除。你可以在CLAUDE.md里写一条规则## 删除操作规范 - 任何删除操作必须先执行 dry-run 版本 - 对于 git clean必须使用 git clean -fdn 预览 - 对于 rm必须先用 ls 确认目标文件 - 禁止直接执行 rm -rf然后在.claude/settings.json里允许Bash(git clean -fdn)但 denyBash(git clean -fd)。这样 Claude Code 只能预览不能执行。如果你用的是 Claude Code 的 Hook 系统可以写一个 PreToolUse Hook 来拦截所有删除命令。在.claude/hooks/block-destructive.sh里写入#!/bin/bash CMD$(jq -r .tool_input.command) DANGEROUS(^|[;|$(]| )(rm[[:space:]]-[a-z]*[rRfF]|sudo[[:space:]]|git reset --hard|git clean -fd|git push --force) if echo $CMD | grep -Eq $DANGEROUS; then jq -n --arg cmd $CMD { hookSpecificOutput: { hookEventName: PreToolUse, permissionDecision: deny, permissionDecisionReason: (阻断破坏性命令: $cmd) } } exit 0 fi exit 0然后给脚本加执行权限chmod x .claude/hooks/block-destructive.sh在.claude/settings.json里注册这个 Hook{ hooks: { PreToolUse: [ { matcher: Bash, hooks: [ { type: command, command: .claude/hooks/block-destructive.sh } ] } ] } }这个 Hook 会在 Claude Code 执行任何 Bash 命令之前运行如果命令匹配到危险模式就直接拒绝。注意Hook 脚本里的jq是必须的你需要先安装它。在 macOS 上可以用brew install jq在 Ubuntu 上可以用apt install jq。最后如果你用的是 Claude Code 的 Coding Plan 模式建议把settings.json放在用户级目录~/.claude/settings.json而不是项目级。因为项目级的配置可能会被 Claude Code 在重构时修改。用户级的配置对所有项目生效而且不会被 AI 误删。4. 验证请求与成功结果确认权限配置生效配置写完之后你需要验证它是否真的生效。这一步很重要因为很多人写完配置就直接开始重构结果发现 Claude Code 还是能执行危险命令。验证方法分三步。第一步检查 Claude Code 的版本。运行claude --version确保版本号大于等于2.1.53。这个版本修复了一个权限解析顺序的漏洞之前的版本可能会在显示信任确认对话框之前就加载了恶意仓库的settings.json。如果你的版本低于这个先升级npm update -g anthropic-ai/claude-code第二步测试 deny 规则。在 Claude Code 的交互界面里输入请执行 git clean -fd如果配置生效Claude Code 会拒绝执行并提示「该命令被 deny 规则阻止」。如果它直接执行了说明你的deny规则没写对或者settings.json的路径不对。第三步测试 allow 规则。输入请执行 git status如果配置生效Claude Code 会直接执行不会弹确认框。如果它弹了确认框说明allow规则没匹配上。检查一下Bash(git status)是否写在了allow列表里注意不要写成Bash(git status *)因为git status通常不带参数。第四步测试 Hook。输入请执行 rm -rf node_modules如果 Hook 生效Claude Code 会拒绝执行并显示「阻断破坏性命令: rm -rf node_modules」。如果它执行了检查 Hook 脚本的路径和权限以及settings.json里的hooks配置是否正确。第五步验证 TaoToken 的 API 通道。在 Claude Code 里输入请用一句话解释什么是 React Compiler如果配置正确Claude Code 会通过 TaoToken 的通道请求模型并返回结果。你可以在https://taotoken.net/console里看到这次请求的记录。如果请求失败检查ANTHROPIC_BASE_URL是否设置为https://taotoken.net/api以及ANTHROPIC_API_KEY是否有效。成功的结果应该是这样的Claude Code 能正常读取和编辑src/目录下的文件能执行git status和git diff但无法执行rm、git clean、git reset --hard这些危险命令。同时所有的 API 请求都走 TaoToken 的通道你可以在控制台里看到用量和日志。如果你在验证过程中遇到了401 Unauthorized错误说明 API Key 无效或过期。去https://taotoken.net/api-keys重新创建一个 Key然后更新settings.json里的ANTHROPIC_API_KEY。如果遇到了local proxy failed错误说明 Claude Code 无法连接到 TaoToken 的 API 端点。检查你的网络环境确保能访问https://taotoken.net/api。如果是在公司内网可能需要配置代理但注意不要用任何违反规定的代理工具。如果遇到了reading choices错误说明 API 返回的响应格式不对。这通常是因为ANTHROPIC_BASE_URL配置错了比如多写了/v1或者少写了/api。正确的地址是https://taotoken.net/api不要加其他路径。5. 本篇常见错误排查401、local proxy failed、reading choices、OAuth这一节列出我在配置过程中遇到过的真实报错以及对应的解决方法。每个报错都附上完整的错误信息和修复步骤。错误一401 Unauthorized完整报错API Error: 401 Unauthorized - {error:{type:authentication_error,message:Invalid API Key}}原因ANTHROPIC_API_KEY无效或过期。可能是 Key 复制时漏了字符或者 Key 已经被删除。解决方法去https://taotoken.net/api-keys重新创建一个 Key然后更新settings.json里的ANTHROPIC_API_KEY。如果你用的是环境变量记得重新 export 或者重启终端。错误二local proxy failed完整报错Error: connect ECONNREFUSED 127.0.0.1:8080 local proxy failed原因Claude Code 试图通过本地代理连接 API但代理没有启动。这通常是因为你在环境变量里设置了HTTP_PROXY或HTTPS_PROXY但代理服务没运行。解决方法检查环境变量里有没有HTTP_PROXY或HTTPS_PROXY如果有取消设置unset HTTP_PROXY unset HTTPS_PROXY然后重新启动 Claude Code。如果你确实需要代理确保代理服务正在运行并且地址和端口正确。错误三reading choices完整报错Error: Cannot read properties of undefined (reading choices)原因API 返回的响应格式不符合预期。这通常是因为ANTHROPIC_BASE_URL配置错了比如写成了https://taotoken.net/api/v1或者https://taotoken.net。解决方法确保ANTHROPIC_BASE_URL设置为https://taotoken.net/api不要加/v1或其他路径。然后重启 Claude Code。错误四OAuth 相关错误完整报错Error: OAuth token expired. Please re-authenticate.原因Claude Code 试图用 OAuth 认证但你配置的是 API Key 认证。这通常是因为settings.json里同时配置了 OAuth 和 API Key导致冲突。解决方法检查~/.claude/settings.json里有没有oauth相关的配置如果有删掉。然后确保ANTHROPIC_API_KEY和ANTHROPIC_BASE_URL正确配置。如果你之前用 OAuth 登录过运行claude logout清除 OAuth 状态然后重新配置 API Key。错误五权限配置不生效完整报错没有报错但 Claude Code 仍然能执行rm -rf。原因settings.json的路径不对或者deny规则的语法写错了。解决方法检查settings.json是否在正确的位置。项目级的配置在.claude/settings.json用户级的配置在~/.claude/settings.json。然后检查deny规则的语法比如Bash(rm:*)是正确的Bash(rm *)是错误的。注意冒号和星号的位置。如果你用的是 CC Switch 或者 Cline MCP需要确保三件套配置完整Base URL、Key、Model ID。Base URL 是https://taotoken.net/apiKey 是你的 TaoToken KeyModel ID 是claude-sonnet-4-20250514或你指定的其他模型。这三个缺一不可否则会出现model not found或authentication failed错误。如果你用的是 Codex 的auth.json配置格式是这样的{ openai: { apiKey: 你的_TaoToken_Key, baseURL: https://taotoken.net/api } }注意Codex 的配置文件和 Claude Code 不同它用的是openai字段而不是anthropic。如果你同时用这两个工具需要分别配置。6. 从权限配置到长期编码把 TaoToken 接入你的重构工作流权限配置只是第一步。真正让 Claude Code 在重构任务里安全工作的是把 TaoToken 的 API 通道和权限白名单结合起来形成一个可重复的工作流。我的做法是这样的每个重构任务开始之前先创建一个 Git Worktree。在终端里执行git worktree add ../myproject-refactor feature/ai-refactor cd ../myproject-refactor然后在 Worktree 目录里启动 Claude Code。这样即使 Claude Code 出了问题影响范围也只限于这个 Worktree你的主分支和主工作区完全不受影响。接着在 Worktree 的.claude/settings.json里配置权限白名单。注意Worktree 是一个独立的目录它的.claude/settings.json不会影响主仓库。你可以根据重构任务的具体需求调整allow和deny列表。然后在CLAUDE.md里写清楚重构的目标和约束。比如## 重构目标 - 将 src/components 下的函数组件迁移到 React Compiler 架构 - 保持所有现有测试通过 - 不要修改 .git 目录中的任何内容 ## 禁止操作 - 禁止执行 git clean、git reset --hard、git push --force - 禁止删除任何未在任务中明确指定的文件 - 禁止修改 package.json 中的依赖版本最后启动 Claude Code 时用 TaoToken 的 Coding Plan 模式。在终端里执行export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEY你的_TaoToken_Key claude --model claude-sonnet-4-20250514这样配置之后Claude Code 的所有请求都走 TaoToken 的通道你可以在控制台里看到每次请求的用量和日志。如果发现异常调用可以及时中断任务。对于长期编码任务建议把settings.json放在用户级目录~/.claude/settings.json这样所有项目都会继承这套权限配置。然后针对每个项目在项目级的.claude/settings.json里覆盖特定的规则。比如某个项目需要允许Bash(npm run deploy)就在项目级配置里加上这条 allow 规则。如果你在团队里推广这套方案可以创建一个配置模板仓库把settings.json、CLAUDE.md、Hook 脚本都放进去。新项目初始化时直接复制这些文件然后根据项目需求微调。最后说一个我踩过的坑Claude Code 的权限配置是分层加载的用户级配置先加载项目级配置后加载项目级会覆盖用户级。但deny规则是累加的不会因为项目级配置而取消用户级的 deny。这意味着如果你在用户级配置里 deny 了Bash(rm:*)在项目级配置里 allow 了Bash(rm:*)最终结果仍然是 deny。这个设计是合理的因为安全规则不应该被项目级配置覆盖。如果你需要临时允许某个危险命令不要改settings.json而是用 Claude Code 的交互式确认。在settings.json里把该命令设为ask这样每次执行时都会弹确认框。比如{ permissions: { ask: [ Bash(git push:*) ] } }这样配置之后Claude Code 执行git push时会问你你确认后才执行。这比直接 allow 安全得多。整套流程跑下来你会发现 Claude Code 在重构任务里的表现稳定很多。它不再擅自清理仓库也不会误删.git目录。你可以在https://taotoken.net/doc里找到更多关于 API 通道和权限配置的文档。如果你需要长期做代码重构建议用 Coding Plan 模式把 Key 和权限配置固定下来避免每次重新配置。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →