资讯详情

OpenResearch orx-git 技能实战:用 Git worktree 与 orx/<slug> 分支管理实验代码的版本与不可变历史

📅 2026/9/20 2:57:07 | 华诺云谱 👁 阅读
OpenResearch orx-git 技能实战:用 Git worktree 与 orx/<slug> 分支管理实验代码的版本与不可变历史
人工智能AI Agent深度研究自主智能体Agent 编排【免费下载链接】OpenResearchTurn your coding agents into research agents项目地址https://gitcode.com/GitHub_Trending/op/OpenResearch点击查看免费下载OpenResearchorx把 Git 当作实验历史的数据库每一个实验节点都对应一条本地orx/slug分支每一次运行都从这条分支的已提交 commit 构建不可变源码归档GitHub 发布仅用于协作者可见性、从不参与计算传输。本文以agent-skills/orx-git/SKILL.md为骨架结合仓库源码src/local/git.rs、src/local/experiments.rs、src/compute.rs、src/local/localrun.rs等深入讲解会话工作树模型、分支协作规则、提交即运行机制、父子实验对比以及历史不可变纪律。读完后你将能在多 Agent 并行会话中安全地操作实验代码、避免重复劳动与分支冲突并能准确理解已提交内容才是可复现结果这条底层契约。一、核心原则Git 记录实验但 Git 不是计算传输通道orx-git技能的第一条纪律是定位问题Git 记录每一个实验分支与提交是实验节点事实状态的唯一来源任何一次运行都要能精确回溯到跑的是哪一段代码。GitHub 发布是可选项发布publication可能被启用目的是让协作者看到进展它绝不参与计算传输compute transport。计算后端拿到的是从已记录 commit 构建出的源码归档而不是远程仓库。遵守项目 playbook 的发布状态不要仅仅为了启动计算而push同时不要从论文的上游仓库fetch也不要把结果发布回论文的上游仓库——实验仓库与论文源仓库是两个互相隔离的宇宙。这一原则在源码里被反复落实。例如 src/local/git.rs 中的github_publication与remote_matches_publication会检查github、origin、upstream三个 remote 的 fetch/push URL 是否都指向项目声明的owner/repo只有完全匹配才算发布已配置而 src/compute.rs 的模块注释则直接写明本地 Git 是实验历史数据库启动运行时绝不要求远端后端克隆这段历史而是把精确记录的 commit 归档一次、按 SHA-256 寻址、交给选定的提供方适配器。计算传输的单元是内容寻址的源码归档不是 git clone。二、多会话协作模型同一克隆上的兄弟工作树2.1 会话工作树从哪来在orx up的本地会话中每个聊天会话chat session都工作在同一个克隆的**兄弟工作树sibling worktree**里。源码层面src/local/git.rs 给出了目录约定共享克隆data/repos/owner/repo会话工作树data/worktrees/project_id/session_idensure_session_worktreesrc/local/git.rs的注释精确描述了这套设计的收益工作树共享 hub 的对象存储和 refs——在一个工作树里创建的分支其他所有工作树立即可见一次fetch更新所有人git 本身会拒绝在两个工作树同时检出同一个分支。这正是技能文档要求开工前先勘察现场的原因。2.2 开工前的现场勘察因为其他会话可能正在同一个克隆的兄弟工作树里工作动手前必须先回答别人在做什么# 查看所有分支本地 远端跟踪了解谁占了哪些 orx/slug git branch -a # 查看项目最近运行记录避免重复跑已经回答过的问题 orx runs projectId # 查看相关实验节点的备注读取兄弟会话留下的上下文 orx exp desc expIdorx runs projectId的实现见 src/commands/runs.rs它把项目运行记录渲染成表格含状态、时长、commit 短 SHA。orx exp desc expId支持--set text写备注、cat notes.md | orx exp desc expId --stdin从文件灌入实现位于 src/plane/local_plane.rs。技能强调边学边记让实验备注保持最新兄弟会话才能据此定位。2.3 一分支一 owner检出冲突的处理规则分支和 remote 是共享的工作树目录是私有的。因此一条分支只有一个工作树 owner如果git checkout报branch is already checked out只有当错误信息里列出的路径就是你自己的工作树时才继续操作否则把那条分支留给它的 owner 会话不要抢占。这背后是 git worktree 的硬约束同一分支只能在一个工作树中被检出。正是利用这一点OpenResearch 才能放心让多个 Agent 并行——冲突在 git 层就被拒之门外。2.4 工作树以 detached 状态起步会话工作树默认从 baseline 以 detached HEAD 起步src/local/git.rs 的注释直接检出 baseline 分支本身会认领它、堵死所有兄弟会话所以进入会话后第一件事是git checkout orx/slug切到自己的实验分支在编辑之前完成切换避免把改动落在游离的 HEAD 上。底层命令是git worktree add --detach path start_ref见ensure_worktree_fromsrc/local/git.rsstart_ref 默认取项目的 baseline 分支。这也是为什么技能里说check out the experiment branch before editing。三、一个实验节点 一条 orx/ 分支3.1 分支如何创建每个实验节点都有自己的一条本地orx/slug分支。orx create-experiment负责从父节点创建它orx create-experiment projectId --title title [--parent experimentId] [--description text] [--run-command cmd]用法定义在 src/commands/create_experiment.rs形状选择规则见该文件头部注释--parent id→ 从该父实验分支出去的子实验--baseline→ 新建一条 baseline根节点项目可持有多个 baseline不带参数 → 取项目最老的根节点树为空时新建 baseline。slug由标题派生并去重。实现位于 src/local/experiments.rsunique_slug扫描项目里所有已有实验的 slug 与全部本地分支的orx/前缀生成base、base-2、base-3…… 这样第一个可用值随后用git branch --no-track new parentsrc/local/git.rs从父分支的本地 tip拉出orx/slug。注意--no-track实验分支不绑定上游跟踪避免与远端发布互相干扰。3.2 标准工作流编辑 → 提交在每个会话工作树里只做这一个实验的改动然后git checkout orx/slug git status --short # 确认起点干净 git add changed files git commit -m describe the experiment change提交信息应当描述实验变更本身如调整的学习率、换用的数据集、修改的损失函数而不是泛泛的 update。3.3 边界情况baseline 之前的老根实验源码里还处理了一个历史遗留问题src/local/experiments.rs 的legacy_root_warning会警告在 baseline 拥有自己的orx/*分支之前创建的根实验是骑在项目 base 分支上的。遇到这类节点时把它当作base 分支上的根实验处理不要误解成分支丢失。四、提交即运行不可变源码归档4.1 运行只认已提交的 commitrunner 从记录的 commit 构建不可变源码归档immutable source archive已提交的内容在所有后端上都是充分的sufficient。未提交的文件永远不会被包含进一次运行。具体机制在 src/compute.rs 的SourceSnapshot::create用git rev-parse取实验分支的 HEAD 作为revisionlocal_head_sha见 src/local/git.rs调用git archive --formattar revisionarchive函数src/compute.rs把该 commit 的完整树打成 tar对 tar 计算 SHA-256 摘要按digest.tar内容寻址存放于data/source-snapshots/权限收紧到 0600/0700运行记录里写入commit_shaStoredRun.commit_sha见 src/local/localrun.rs。因为快照按内容寻址同样的代码只归档一次install_content_addressedsrc/compute.rs还会在复用缓存时做 digestsize 双校验防止缓存被篡改。运行侧的脚本snapshot_scriptsrc/compute.rs则是set -eo pipefail; mkdir -p repo; tar -xf archive -C repo; cd repo; run-command即从归档解出精确的 commit 树在独立的运行目录里执行绝不动 Agent 的工作树src/local/localrun.rs 的注释the run extracts the recorded revision into its own run dir, never the agents worktree。远程后端同理——src/local/k8s.rs 的注释强调代码在记录的 revision 上被读取与 job 收到的 commit 完全一致。这也解释了为什么每个后端HF、Modal、K8s、Ray、Slurm、SSH、OpenResearch、Local/Tinker的启动代码里都带着source_digest/source_path字段见 src/jobs/mod.rs 与各src/local/*.rs的BackendDescriptor构造。4.2 启动前检查因此在启动一次运行之前务必确认git status --short # 必须为空未提交改动不会进运行 git show --stat --oneline HEAD # 核对将要被归档的 commit 内容git show --stat --oneline HEAD让你在按下运行键之前用眼睛确认将要运行的就是这条提交。一次干净的git status --short 一条符合预期的git show是我的运行是可复现的的最小证明。4.3 备注信息与运行命令的继承orx exp desc expId的备注、--run-command都会随节点保存运行命令解析遵循实验自带 项目默认的优先级src/local/localrun.rs、src/local/experiments.rs。运行记录StoredRun里同时保存了commit_sha、command、status等供orx runs与orx exp status expId展示后者会打印last run: … commit …见 src/plane/local_plane.rs。五、对比子实验与父实验只使用本地 refs要弄清子实验相对于父实验改了什么只使用本地 ref不要上网# 三点 diffmerge-base 语义累计展示父分支与子分支之间的全部差异 git diff parent-branch...orx/child-slug # 仅列出子分支上多出的提交parent..child git log --oneline parent-branch..orx/child-slug这套命令与仓库内部实现完全一致diff_range使用base...head三点、merge-base 语义src/local/git.rslist_commits_between使用base..headsrc/local/git.rs且都通过resolve_commitishsrc/local/git.rs优先解析本地 ref、其次回退到refs/remotes/origin/。原因很直接Agent 的工作先提交到本地orx/slug分支本地 ref 才是最新、最权威的对比基准远端可能还没 push甚至不该 push。六、历史不可变永不 merge / rebase 实验分支一次运行回答了某个实验之后该分支及其历史就是不可变的immutable。它精确记录着当时跑过的那段代码任何改写都会让历史失去证词价值。因此绝不merge 或 rebase 一条已完成的实验分支需要并入其他工作成果时创建子实验把 merge commit 放在子分支上绝不rebase 实验历史——它记录的是实际运行过的精确代码。这条纪律在 UI 和模型层同样有呼应例如 UI 中的文件版本/分支变更视图ui/src/components/BranchChanges.tsx、ui/src/components/GitDiff.tsx都围绕分支 commit呈现而非工作区草稿运行记录的 diff 上限MAX_DIFF_BYTESsrc/local/git.rs也保证了任何被展示的 diff 都源于 git 对象库可追溯。七、GitHub 发布只推 baseline 与 orx/*发布用于协作者可见性遵循项目 playbook 的发布状态即可。仓库实现的发布边界非常清晰只推送 baseline 分支和orx/前缀的分支push_allsrc/local/git.rs过滤branch baseline_branch || branch.starts_with(orx/)按 baseline 优先排序后逐条git push -u remote branch发布 remote 按github→origin→upstream顺序识别publication_remotesrc/local/git.rs要求 fetch 与全部 push URL 都指向项目声明的仓库推送走认证通道authenticated_git_commandsrc/local/git.rs显式禁用交互提示GIT_TERMINAL_PROMPT0、ssh -oBatchModeyes并把凭据 helper 限定为!gh auth git-credential避免把用户的全局 git 配置卷进来发布状态可查询publication_sync_statussrc/local/git.rs会对比本地与远端的 heads返回not configured/not pushed/local changes to push/synced之一。与论文上游仓库的关系要始终保持只读隔离不要fetch论文上游、更不要发布回上游。涉及论文仓库导入时仓库还做了浅克隆重定根reroot_shallow_repository、prepare_shallow_repository_for_publicationsrc/local/git.rs与克隆时对 URL 的严格校验public_clone_urlsrc/local/git.rs目的都是保证论文源仓库与实验仓库两条线互不污染。八、常见故障与边界情况速查现象处理方式源码依据checkout报分支已被检出仅当列出的路径是自己的工作树时才继续否则留给 owner 会话ensure_session_worktree注释src/local/git.rs工作树处于 detached HEAD编辑前先git checkout orx/sluggit worktree add --detachsrc/local/git.rs想启动运行但git status --short非空先提交未提交文件不会进归档SourceSnapshot::createsrc/compute.rs想确认将运行的代码git show --stat --oneline HEADsnapshot_scriptsrc/compute.rs老根实验警告按base 分支上的根实验理解无需修复legacy_root_warningsrc/local/experiments.rs手动删除了工作树目录导致worktree add失败仓库会自动git worktree prune清理陈旧注册ensure_worktree_fromsrc/local/git.rs克隆/发布遇到认证发布走gh auth git-credential克隆优先 ssh、回退 https均禁交互authenticated_git_command、ensure_clonesrc/local/git.rs运行记录的源码归档缺失按 digest 校验失败会明确报错不会静默降级SourceSnapshot::from_runsrc/compute.rs九、总结orx-git 的三条纪律把agent-skills/orx-git/SKILL.md浓缩成三条纪律也就把握住了 OpenResearch 实验版本管理的全部精髓先勘察、后动手git branch -aorx runsorx exp desc三连尊重一分支一 owner避免与兄弟会话互相踩踏。提交即事实运行只认orx/slug分支上已提交的 commit源码归档按 SHA-256 内容寻址、跨后端一致启动前用git status --short和git show --stat --oneline HEAD自检。历史是证词不可改写已回答的实验分支永不 merge/rebase需要合并就开子分支发布只推 baseline 与orx/*且与论文上游仓库彻底隔离。遵循这三条纪律多 Agent 并行研究会话就能在同一克隆上互不干扰地工作而每一行跑过的代码都能精确回溯——这正是把编码 Agent 变成研究 Agent的版本管理地基。相关实现可继续深入 src/local/git.rs、src/local/experiments.rs、src/compute.rs 与 src/local/localrun.rs 阅读。赞分享人工智能AI Agent深度研究自主智能体Agent 编排【免费下载链接】OpenResearchTurn your coding agents into research agents项目地址https://gitcode.com/GitHub_Trending/op/OpenResearch点击查看免费下载相关推荐OpenResearch orx-create 实战指南从 orx up 建项目到 orx create-experiment 构建实验树OpenResearch orx create 实战指南从 orx up 建项目到 orx create experiment 构建实验树 导读 orx cr人工智能AI Agent深度研究自主智能体Agent 编排note-gen与Git版本控制提交历史与分支管理功能note gen与Git版本控制提交历史与分支管理功能 引言AI笔记与版本控制的融合痛点 你是否曾在写作过程中误删重要内容是否需要追踪笔记的修改轨迹作为AI 应用桌面应用移动开发知识管理OpenResearch 后端实战用 orx exp run --backend openresearch 按次计费拉起临时 GPU/CPU 沙箱OpenResearch 后端实战用 orx exp run backend openresearch 按次计费拉起临时 GPU/CPU 沙箱 本指南讲解 O人工智能AI Agent深度研究自主智能体Agent 编排创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。