前言
我的 Hermes 是部署在局域网的机器上的,而目前 Hermes 不支持飞书渠道的 Cardkit 卡片消息,所以我自己打了补丁来实现。而在服务器上真实测试时,之前的流程是汇总改动的文件,然后去服务器上 Hermes 源代码目录中替换掉对应文件。但如果在服务器上使用hermes update更新时,又会被官方代码覆盖了(虽然可以恢复暂存,但不好应对冲突情况)。
最近在 Claude 的帮助下,发现一个非常舒服的开发/更新流程。
核心判断
Hermes 的 hermes update 在拉代码阶段固定执行:
git pull --ff-only origin <branch>所以更新来源由服务器部署目录里的 origin remote 决定。
只要 origin 指向个人 fork,hermes update 就会从 fork 拉取 main,并继续执行 Hermes 自带的快照、pull、语法校验、回滚保护、清 bytecode、依赖重装、迁移等步骤。
fork 检测静音
hermes update 检测到 origin 是 fork 时,可能会提示或尝试同步官方 upstream。为了让服务器更新只关注个人 fork,需要满足:
- 服务器上没有
upstreamremote。 - 存在
$HERMES_HOME/.skip_upstream_prompt。
注意:
.skip_upstream_prompt只负责静音 fork 检测提示,不负责改变代码拉取来源。真正让 update 拉 fork 的开关是origin。
配置 fork 更新流程
基于以上判断,可以设置新的更新流程。
我的服务器的相关路径:
- Hermes 源码目录:
/usr/local/lib/hermes-agent HERMES_HOME目录:~/.hermes
cd /usr/local/lib/hermes-agent
# 1. 改 origin 指向个人 forkgit remote set-url origin https://github.com/LetTTGACO/hermes-agent.git
# 2. 确认无 upstream remote(fork 检测静音前提)git remote get-url upstream 2>/dev/null || echo "无 upstream,OK"
# 3. 建 skip 标记,有这个文件就行,不需要有内容touch "~/.hermes/.skip_upstream_prompt"
# 4. fetch fork 并对齐到 fork main(清掉工作区手工补丁)git fetch origingit reset --hard origin/main
# 5. 尝试一次Hermes更新,会自动重启hermes update新的开发流程
1. 设置本地项目 upstream 为官方仓库
如果需要 fork 仓库的代码能定期保持和官方仓库代码一致,可以设置此项:
git remote add upstream https://github.com/NousResearch/hermes-agent.git2. 将 upstream 的最新改动同步到 fork 仓库
git fetch upstreamgit merge upstream/main # 冲突:解决后 git add + git commitgit push origin main # merge 不改写历史,普通 push 即可。注意:
git merge会让提交记录多一条 merge 记录,如果要保持单线提交,就得用到git rebase upstream/main改写提交历史了。我暂时自用的话,就直接 merge了,不制造复杂度。
3. 修改代码并合并到 main 分支
不管是新建分支还是新建 worktree 进行开发,开发完只需要将提交合并到 fork 仓库的 main 分支就行,然后推送到 fork 仓库。
4. 更新服务器的 Hermes
直接执行hermes update,Hermes 的更新流程就变成从你的 fork 仓库 main 分支拉取最新代码了。
Hermes 支持飞书 Cardkit 卡片流式输出
展示下我的成果。目前官方 Hermes 在飞书上的表现
我打了补丁之后的效果
因为目前我主要是自用,可能会有一些我没体验到的 BUG。如果有想用的话,可以直接按照【配置 fork 更新流程】设置为我的仓库就行。
