news 2026/9/28 4:18:56

Claude Code 长期任务越跑越慢?用 Hooks + Git 给 Compact 补上工程方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Claude Code 长期任务越跑越慢?用 Hooks + Git 给 Compact 补上工程方案

1. 长会话越跑越慢,问题到底出在哪

如果你用 Claude Code 跑过超过两小时的重构任务,大概率见过这个画面:前几轮对话思路清晰、改代码干净利落,跑到后面开始反复改同一段逻辑,删了又加、加了又删,最后你只能clear重开。这不是模型变笨了,而是长会话里上下文被反复压缩后,任务连续性断掉了。

Claude Code 的 Compact 机制会在上下文接近窗口上限时,把之前的对话总结成一段摘要,丢掉细节、保留"关键信息"。听起来合理,但压缩是有损的:第一次压缩还能保住主干,第二次在摘要基础上再摘要,第三次就开始丢关联。就像复印件的复印件,每复印一次清晰度掉一级,最后连自己写过什么函数都记不清。

Anthropic 在《Effective harnesses for long-running agents》里点破了这件事:长期运行代理的根本挑战不是模型能力,而是记忆的工程化管理。Compact 只是权宜之计,真正管用的是把状态外置到文件系统——用 Git 存历史、用进度日志存摘要、用特性清单存任务边界,再通过 Claude Code 的 Hooks 系统在每次会话启动时自动把这些上下文注入进去。

这篇就按这个思路走:先讲清楚 Compact 为什么会衰减,再给出可复制的settings.json配置骨架和 Hooks 脚本,最后用 Git 快照验证压缩前后的任务连续性。适合正在用 Claude Code 做长期编码任务、被"越跑越慢"折磨过的开发者。

2. 前置准备:TaoToken 接入与 Claude Code 环境

要让 Hooks 和 Git 协同工作,前提是 Claude Code 能稳定跑起来。我这边是通过 TaoToken 接入的,它提供 Claude 系列模型的 API 通道,配置方式和官方一致,省去自己折腾鉴权的麻烦。

先去控制台拿一个 API Key,地址是 https://taotoken.net/api-keys ,登录后新建一个 Key 复制出来。然后在终端里配置环境变量,Claude Code 会读取ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY这两个变量:

export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你的key"

如果你用的是 Claude Code CLI,也可以写进~/.claude/settings.json的env字段里,避免每次开终端都要 export。配置完跑一句claude --version确认能正常启动,再随便问一句"列出当前目录文件"验证通道通了。

模型选择上,长任务建议用 Opus 4.5 或 Sonnet 4.5,前者推理更稳、后者速度更快。如果你打算长期跑编码 Agent,可以看下 Coding Plan 的额度方案: https://taotoken.net/coding-plan ,按量或包月都行,比单次调用划算。接入文档在 https://taotoken.net/doc ,里面有各语言 SDK 的示例,遇到 401/429 报错先翻这里。

环境通了之后,我们进入正题:怎么用 Hooks 把 Anthropic 那套双代理工作流落到 Claude Code 里。

3. 可复制配置:settings.json 骨架与 Hooks 脚本

Claude Code 的 Hooks 系统允许你在特定事件触发时执行 shell 命令,最有用的是SessionStart(会话启动)和PreCompact(压缩前)。前者用来注入上下文,后者用来在压缩前打 Git 快照,这样即使压缩丢了细节,也能从快照里找回。

先建目录结构:

mkdir -p .claude/hooks touch .claude/hooks/session_start.sh touch .claude/hooks/pre_compact.sh chmod +x .claude/hooks/*.sh

session_start.sh的作用是在每次新会话开始时,把 Git 状态、进度日志、待办特性自动打印出来,让模型一上来就知道"现在在哪、还剩什么":

#!/bin/bash echo "=== 项目上下文自动加载 ===" echo "" echo "## 当前分支" git branch --show-current 2>/dev/null || echo "非 Git 仓库" echo "" echo "## 最近 5 次提交" git log --oneline -5 2>/dev/null echo "" echo "## 工作区状态" git status --short 2>/dev/null if [ -f "feature_list.json" ]; then echo "" echo "## 待完成功能(前 5 项)" jq -r '.[] | select(.passes == false) | "- \(.description)"' feature_list.json 2>/dev/null | head -5 fi if [ -f "claude-progress.txt" ]; then echo "" echo "## 最近工作进展" tail -5 claude-progress.txt fi

pre_compact.sh更关键,它在 Compact 触发前自动 commit 一次,把当前工作区状态固化下来:

#!/bin/bash if [ -n "$(git status --porcelain)" ]; then git add -A git commit -m "auto-snapshot before compact $(date +%Y%m%d-%H%M%S)" --no-verify echo "已创建压缩前快照" else echo "工作区干净,无需快照" fi

然后在.claude/settings.json里挂上这两个 Hook:

{ "hooks": { "SessionStart": [ { "hooks": [ { "type": "command", "command": ".claude/hooks/session_start.sh" } ] } ], "PreCompact": [ { "hooks": [ { "type": "command", "command": ".claude/hooks/pre_compact.sh" } ] } ] } }

注意:PreCompact事件名在不同 Claude Code 版本里可能略有差异,如果你的版本不识别,可以退而求其次用Stop事件,在每轮对话结束时打快照。配置改完记得重启 Claude Code 让 Hook 生效。

这套配置的核心思路是:把 Compact 从"唯一记忆"降级为"辅助摘要",真正的记忆交给 Git。压缩丢了什么,git log和git diff里都能找回来。

4. 验证请求:用 Git 快照检查压缩前后连续性

配置好之后,怎么验证它真的起作用了?我设计了一个小实验:让 Claude Code 做一个需要多轮才能完成的任务,观察 Compact 触发前后的 Git 历史。

先准备一个feature_list.json,把任务拆成 5 个特性:

[ {"description": "实现用户登录接口", "passes": false}, {"description": "添加 JWT 鉴权中间件", "passes": false}, {"description": "实现密码加密存储", "passes": false}, {"description": "编写登录单元测试", "passes": false}, {"description": "更新 API 文档", "passes": false} ]

然后启动 Claude Code,给它一个长任务指令:

claude "读取 feature_list.json,按顺序实现每个特性,每完成一个就 commit 并更新 passes 字段"

跑的过程中,当上下文接近上限、Compact 触发时,pre_compact.sh会自动打一个快照。你可以在另一个终端里实时观察:

watch -n 5 'git log --oneline -10'

正常情况你会看到类似这样的历史:

a3f2c1d auto-snapshot before compact 20250115-143022 b8e4d2a 实现密码加密存储 c1a9f3e 添加 JWT 鉴权中间件 d7b2e4f 实现用户登录接口

压缩前的那次 auto-snapshot 就是关键证据——它证明在上下文被压缩之前,工作区状态已经被完整保存。压缩之后如果模型"失忆"了,你可以让它执行git log --oneline -20和git diff HEAD~3来重建上下文,而不是靠那段有损的摘要。

验证成功的标志有三个:一是git log里能看到 auto-snapshot 记录;二是压缩后模型仍能正确说出"上一个完成的特性是什么";三是feature_list.json的passes字段在持续推进,没有出现回退或重复实现。

如果压缩后模型开始重复造轮子,说明 Hook 没生效或者 Git 历史没被正确读取。这时候手动跑一次session_start.sh看输出,确认它能打印出待办列表和最近提交。

5. 本篇常见错排查

报错一:jq: command not found

session_start.sh里用了jq解析 JSON,macOS 上默认没有。装一下:

brew install jq # macOS sudo apt install jq # Ubuntu/Debian

不想装jq的话,可以把那行换成python3 -c "import json;...",但jq更简洁,建议装上。

报错二:Hook 不触发,SessionStart 没输出

先确认settings.json的路径对不对——项目级配置在.claude/settings.json,用户级在~/.claude/settings.json。再确认脚本有执行权限:ls -l .claude/hooks/看有没有x。最后确认脚本第一行的 shebang 是#!/bin/bash而不是#!/bin/sh,后者在某些系统上不支持[[ ]]语法。

报错三:pre_compact.sh报nothing to commit

这是正常的,说明工作区干净、没有未提交改动。但如果你明明改了代码却报这个,检查是不是在子目录里跑 Claude Code,而 Git 仓库根目录在上一层。用git rev-parse --show-toplevel确认仓库根位置,必要时把 Hook 里的git命令加上-C参数指定路径。

报错四:Compact 后模型仍重复劳动

大概率是session_start.sh的输出没被模型读到。Claude Code 的 Hook 输出会作为系统消息注入,但如果输出太长(超过几千字),可能被截断。把git log的条数从 20 降到 5,feature_list.json只取前 5 项,保持输出精简。另外确认feature_list.json的passes字段确实在被更新——如果模型忘了改,下次会话就不知道哪些已完成。

报错五:API 返回 429 限流

长任务跑久了容易撞限流。TaoToken 的模型对话入口在 https://taotoken.net/chat ,可以先在那里手动测一下当前 Key 的可用性。如果是 Coding Plan 用户,检查额度是否用完。临时缓解可以在settings.json里加"maxConcurrentRequests": 1降低并发。

6. 把记忆交给 Git,把流程交给 Hooks

回到最初的问题:Claude Code 长期任务为什么越跑越慢?因为 Compact 把"记忆"这件事押注在了有损压缩上,压缩次数越多,任务连续性越差。Anthropic 的解法不是让模型记住更多,而是承认模型会忘,然后把该记的东西全部外置——Git 存历史、日志存摘要、JSON 存任务边界。

Hooks 的价值在于把这套外置流程自动化。SessionStart让每次新会话秒进状态,PreCompact让每次压缩前都有快照兜底。你不需要改 Claude Code 的源码,也不用换模型,只是在.claude/settings.json里挂两个脚本,就能把"越跑越慢"变成"越跑越稳"。

实测下来,配好这套之后,一个原本要clear三次的重构任务,现在一次会话跑完,中间 Compact 触发了两次,但模型每次都能从 Git 历史里找回上下文,没有出现重复劳动。如果你也在被长会话衰减困扰,建议先拿一个小项目试一遍这两个 Hook,跑通了再往大项目上套。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 4:18:56

wordpress/选哪家好

WordPress网站被黑挂马急救指南:5个关键注意事项保安全 刚接手一个北京前端的活儿,客户急得跳脚,说官网突然弹出一堆博彩广告,后台还多了个陌生的管理员账号。这种网站被黑挂马不知道怎么办?别慌,这是WordPress站长最头疼的噩梦。很多新手觉得只要装了插件就安全,结果忽略了基础防护,导致服务器…

作者头像 李华
网站建设 2026/9/28 4:18:51

怎样买空间做网站?后端新手避坑指南

怎样买空间做网站?后端新手避坑指南 域名和服务器这两块石头,压得多少刚入行的小白喘不过气?很多人以为买个便宜空间就能开干,结果网站上线三天,被黑、被挂马、甚至数据全丢。别慌,这份 避坑指南 专门写给不懂技术的你。咱们不聊虚的,直接从安全角度拆解,教你怎么买空间才能睡个安稳觉。 1.…

作者头像 李华
网站建设 2026/9/28 4:18:45

手机销售网站怎么做的全流程拆解与性能优化实战

手机销售网站怎么做的全流程拆解与性能优化实战 很多运营兄弟在接到“做个卖手机的官网”需求时,第一反应不是写代码,而是卡在备案上。看着工信部系统里那些晦涩的术语,备案流程一头雾水,不知道主体信息怎么填,更不知道如何避免被退回。这种焦虑直接拖慢了项目进度。其实,备案只是入场券,真正决定用户是否留在你网站…

作者头像 李华
网站建设 2026/9/28 4:18:38

以前做视频的网站多少钱?别被坑,看这篇避坑指南

以前做视频的网站多少钱?别被坑,看这篇避坑指南 改个需求建站公司拖一周,最后报价单上那个“多少钱”更是让人心里没底。以前做视频的网站,现在想改造成安全稳定的企业展示站或视频门户,到底要花多少钱?这不仅是预算问题,更是安全成本的核算。很多老板觉得网站上线了就是万事大吉,殊不知,那些早年流行的视频解析、…

作者头像 李华
网站建设 2026/9/28 4:18:33

门网站制作新手入门:3种方案报价拆解,避开模板站坑

门网站制作新手入门:3种方案报价拆解,避开模板站坑 很多刚入行的朋友,盯着屏幕上的模板网站直摇头,觉得太丑、太死板,根本不够用。这种“模板站”虽然便宜,但往往限制了品牌个性,导致转化率低得离谱。对于新手入门来说,搞清楚门网站制作背后的逻辑和真实成本,比盲目下单重要一百倍。…

作者头像 李华
网站建设 2026/9/28 4:18:27

电子商务网站建设课程设计报告2026最新

拒绝假大空:从零搭建电商站的运营复盘报告 网站上线三个月,后台流量却只有个位数,这是很多刚做完“电子商务网站建设课程设计”的同学最崩溃的时刻。你代码写得很漂亮,页面切图也很精美,但没人访问,这比代码报错更让人抓狂。别慌,这不是玄学,是你把“建网站”当成了终点,而忽略了“让网站活起来”的运营逻辑。…

作者头像 李华