datawhalechina/hello-agents · warning · PatchApplyError
Patch too large: {total_changed} changed lines > {self.max_t
Error message
Patch too large: {total_changed} changed lines > {self.max_total_changed_lines} What it means
PatchApplyError raised when the estimated total changed lines across all operations exceeds max_total_changed_lines. Like the file-count limit, it is a pre-execution size guardrail: nothing is written, so the working tree stays untouched.
Source
Thrown at Co-creation-projects/YYHDBL-HelloCodeAgentCli/code_agent/executors/apply_patch_executor.py:121
返回:
ApplyResult: 包含被修改文件和备份文件信息的结果对象
异常:
PatchApplyError: 当补丁不符合格式、超出限制或应用失败时抛出
"""
# 解析补丁文本,提取操作列表
ops = self._parse_patch(patch_text)
# 统计受影响的文件数量,检查是否超过限制
touched_files = [op[1] for op in ops if op[0] in {"add", "update", "delete"}]
if len(set(touched_files)) > self.max_files:
raise PatchApplyError(f"Too many files in patch: {len(set(touched_files))} > {self.max_files}")
# 估算补丁修改的总行数,检查是否超过限制
total_changed = self._estimate_changed_lines(ops)
if total_changed > self.max_total_changed_lines:
raise PatchApplyError(f"Patch too large: {total_changed} changed lines > {self.max_total_changed_lines}")
# 创建本次补丁应用的专属备份目录(时间戳命名)
backup_run_dir = self.backups_dir / datetime.now().strftime("%Y%m%d_%H%M%S")
backup_run_dir.mkdir(parents=True, exist_ok=True)
# 初始化结果收集变量
files_changed: List[str] = [] # 记录被修改的文件路径
backups: List[str] = [] # 记录创建的备份文件路径
# 遍历所有解析出的操作,逐个执行
for kind, rel_path, payload in ops:
# 安全检查:确保路径在仓库内,防止路径遍历攻击
target = self._safe_path(rel_path)
# 安全检查:确保文件后缀在允许的列表中
self._enforce_suffix(target)
if kind == "add":View on GitHub (pinned to 606a07d341)
Solutions
- Break the change into sequential patches below the line budget (apply incrementally).
- Reduce patch noise: drop unrelated formatting/hunk churn from the payload.
- If legitimate, raise max_total_changed_lines in the executor configuration.
- The message reports the estimated count so you can size the chunks.
Example fix
# before
executor.apply(huge_patch) # 5000 changed lines > 3000 cap
# after
for part in split_patch_by_lines(huge_patch, max_lines=executor.max_total_changed_lines):
executor.apply(part) Defensive patterns
Strategy: validation
Validate before calling
estimated = estimate_changed_lines(parse_patch(patch_text))
assert estimated <= executor.max_total_changed_lines, \
f"patch too large ({estimated} lines); split it" Try / catch
try:
executor.apply(patch_text)
except PatchApplyError as e:
if str(e).startswith("Patch too large"):
for part in split_patch_by_lines(patch_text, executor.max_total_changed_lines):
executor.apply(part)
else:
raise Prevention
- Budget patch size client-side using the same line-estimate rule as the executor.
- Split big file additions into staged patches applied sequentially.
- Keep unrelated formatting churn out of patches to stay under the cap.
When it happens
Trigger: A patch whose estimated changed-line total (per _estimate_changed_lines over add/update/delete payloads) exceeds the configured cap — e.g. a single Add File with a very long payload.
Common situations: Agent generating a whole new large file in one patch; squashing many edits into one update; threshold tuned down after workflows depended on bigger patches.
Related errors
- Too many files in patch: {len(set(touched_files))} > {self.m
- Add File target already exists: {rel_path}
- Delete File target missing: {rel_path}
- Update File target missing: {rel_path}
- 工具 '{tool_name}' 不存在
AI-assisted analysis of datawhalechina/hello-agents@606a07d341 (2026-08-14).
Data as JSON: /api/errors/6ece51d1a3bd38c6.
Report an issue: GitHub.