OpenClaw 的 Agent 不是只有一段 prompt。它有自己的 workspace,里面放着长期记忆、人格设定、工具约定、skills,以及 memory-core 生成的记忆文件。

这些文件长期积累以后,本质上就是 Agent 的“大脑”。如果机器坏了,或者误删了 workspace,就不只是丢配置,而是丢掉了 Agent 和用户长期协作形成的上下文。

所以这次我把 OpenClaw 的 workspace 接入 Git,推到一个私有仓库里,作为可恢复的备份。

Workspace 在哪里 链接到标题

OpenClaw 默认 workspace 路径是:

~/.openclaw/workspace

在一台示例机器上,对应:

/home/agent/.openclaw/workspace

它和 ~/.openclaw/ 是两个概念:

路径 内容 是否应该进 Git
~/.openclaw/workspace Agent 工作区、记忆、skills 可以,建议私有仓库
~/.openclaw/ 配置、凭据、session、运行状态 不应该提交

OpenClaw 官方文档也明确建议:把 workspace 当作 private memory,放进私有 Git 仓库备份。

官方示例命令大致是:

cd ~/.openclaw/workspace
git init
git add AGENTS.md SOUL.md TOOLS.md IDENTITY.md USER.md HEARTBEAT.md memory/
git commit -m "Add agent workspace"

Workspace 里都有什么 链接到标题

实际查看 workspace,大概有这些文件:

AGENTS.md
SOUL.md
TOOLS.md
IDENTITY.md
USER.md
HEARTBEAT.md
MEMORY.md
DREAMS.md
memory/
skills/
skills-lock.json
.agents/
.openclaw/

其中比较重要的是:

文件 作用
AGENTS.md Agent 的操作原则和长期约定
SOUL.md 人格、语气、边界
USER.md 用户画像和偏好
TOOLS.md 本地工具使用约定
HEARTBEAT.md 定期检查任务
MEMORY.md 长期记忆,最重要
DREAMS.md dreaming 生成的人类可读日记
memory/YYYY-MM-DD.md 每日记忆日志
skills/.agents/ workspace 内的自定义技能

这些文件大多应该进入 Git,尤其是 MEMORY.md 和自定义 skills。它们不可再生,丢了很难恢复。

官方建议之外的现实问题 链接到标题

官方建议把 memory/ 一起提交。但实际执行时,我发现一个问题:memory-core 的一些中间产物里可能包含原始会话片段。

例如:

memory/.dreams/session-corpus/
memory/.dreams/events.jsonl
memory/.dreams/short-term-recall.json.migrated
memory/dreaming/light/
memory/dreaming/rem/
memory/dreaming/deep/

这些文件有两个特点:

  1. 自动生成,变动频繁;
  2. 可能包含原始聊天、token、凭据、webhook 等敏感片段。

官方文档也强调不要提交 secrets、raw dumps of chats、sensitive attachments。于是我的处理原则是:

  • 提交长期稳定记忆;
  • 不提交原始会话 dump;
  • 不提交 dreaming 中间产物;
  • MEMORY.md 中已经沉淀进去的 token 做脱敏。

最终 .gitignore 链接到标题

最终使用的 .gitignore 是:

# Official starter: avoid committing secrets
.DS_Store
.env
**/*.key
**/*.pem
**/secrets*

# OpenClaw runtime state inside workspace
.openclaw/

# Temporary/sandbox folder
~/

# Raw chat dumps / recall runtime artifacts (may contain sensitive transcripts)
memory/.dreams/

# One-time auth / QR artifacts
lark-qr.png

# Dreaming intermediate narrative may include raw snippets/secrets
memory/dreaming/

这里有一个取舍:官方示例只给了防密钥泄露的 starter,但我额外排除了 memory/.dreams/memory/dreaming/

原因不是它们“不重要”,而是它们太接近原始聊天和运行时状态。我的目标是备份 Agent 的可恢复记忆,而不是把所有原始 session 全量归档进 Git。

敏感信息扫描 链接到标题

提交前做了两类检查。

第一,看大文件:

git ls-files --others --exclude-standard -z \
  | xargs -0 du -k \
  | sort -rn \
  | head -20

第二,扫敏感字符串:

git ls-files --others --exclude-standard -z \
  | xargs -0 grep -InE \
  "(sk-[A-Za-z0-9_-]{20,}|whk_[A-Za-z0-9_]+|凭据|password|appSecret|apiKey)" \
  2>/dev/null \
  | head -80

这一步发现:

  • MEMORY.md 里有 webhook token;
  • dreaming 中间产物里有 Windmill token 和凭据片段;
  • raw session corpus 里有大量原始对话。

处理方式:

  • MEMORY.md 里的真实 token 替换为 <OPENCLAW_WEBHOOK_TOKEN><WINDMILL_TOKEN>
  • memory/.dreams/memory/dreaming/ 加入 .gitignore
  • 删除临时脱敏备份文件,避免误提交。

推送到私有仓库 链接到标题

GitHub 上新建私有仓库:

<PRIVATE_GIT_REMOTE_URL>

然后在 workspace 里配置 remote:

cd /home/agent/.openclaw/workspace
git remote add origin <PRIVATE_GIT_REMOTE_URL>
git branch -M main

提交并推送:

git add .
git commit -m "first commit"
git push -u origin main

实际推送前确认:

git ls-files --cached | grep -E "\.dreams|dreaming|node_modules|\.openclaw|lark-qr" || true

确保这些目录没有进入提交。

后续怎么维护 链接到标题

OpenClaw 官方文档只给了手动更新方式:

git status
git add .
git commit -m "Update memory"
git push

也就是说,OpenClaw 没有内置自动 push 机制。实际有三种维护方式:

方式 说明
手动 push 想起来时执行 git 命令
让 Agent 执行 对 OpenClaw 说“提交并推送 workspace”
cron 自动推送 在宿主机每天定时提交

我更倾向于第三种。因为 dreaming 通常凌晨运行,可以在它之后自动提交:

30 3 * * * cd ~/.openclaw/workspace && git add -A && git commit -m "Daily workspace backup $(date +\%F)" && git push

这个 cron 要注意两点:

  1. 如果没有变更,git commit 会失败,最好用脚本包装一下;
  2. commit message 中的 % 在 crontab 里要转义成 \%

更稳一点的脚本是:

#!/usr/bin/env bash
set -euo pipefail
cd ~/.openclaw/workspace

if git diff --quiet && git diff --cached --quiet; then
  exit 0
fi

git add -A
if git diff --cached --quiet; then
  exit 0
fi

git commit -m "Daily workspace backup $(date +%F)"
git push

然后 cron 调这个脚本即可。

我的最终取舍 链接到标题

最终进入 Git 的内容包括:

  • AGENTS.md
  • SOUL.md
  • TOOLS.md
  • IDENTITY.md
  • USER.md
  • HEARTBEAT.md
  • MEMORY.md(已脱敏)
  • DREAMS.md
  • memory/YYYY-MM-DD.md
  • skills/
  • .agents/
  • skills-lock.json

没有进入 Git 的内容包括:

  • memory/.dreams/
  • memory/dreaming/
  • .openclaw/
  • lark-qr.png
  • ~/

这是我认为比较平衡的方案:保留 Agent 的长期记忆和可恢复配置,不把原始聊天、运行态缓存、密钥片段塞进仓库。

总结 链接到标题

OpenClaw workspace 值得接入 Git,而且应该是私有仓库。

它保存的不只是配置,而是 Agent 长期协作积累出的状态:怎么称呼用户、什么工具可用、哪些事情已经发生、哪些判断已经沉淀进长期记忆。

但 Git 化之前一定要做一次清理:

  1. 明确 workspace 和 ~/.openclaw/ 的边界;
  2. 配好 .gitignore
  3. 扫描敏感信息;
  4. 脱敏 MEMORY.md
  5. 不提交 raw session corpus 和 dreaming 中间产物。

这样,Agent 的“大脑”就既能备份,又不会把运行时隐私和密钥一起推上 GitHub。