Files
ycode/docs/沙盒Git接入-2026-10-18.md
T

9.0 KiB
Raw Blame History

沙盒 Git 接入(2026-10-18)

当前组件版本为 0.4.0 / protocol 1。Git 现在默认随 YCode 提供,普通用户无需安装或注册;内置来源、构建和打包验证见内置分发记录。已接入真实 Git for Windows 运行时和跨命令保存的沙盒专用仓库。本记录不表示完整 P2、宿主仓库集成或 WorkBuddy 等价验收完成。

当前可用范围

  • execute_command 显式选择 runtimes: ['git'] 后,可执行本地 status、diff、add、commit -m、log、分支、switch 等操作;也可与 Node/Python 运行时组合。
  • 首次选择 Git 时,从本次过滤后的工作区文件生成一个合成提交,分支名为 ycode-sandbox。基线包含所有通过快照过滤的文件,不复用宿主 Git 的跟踪、暂存或忽略状态。后续 git add 使用沙盒内的 Git 忽略规则。
  • 合成基线保留快照原始字节,初始化的私有 info/attributes 默认禁用 text/filter/ident/eol/working-tree-encoding 自动转换,避免项目 .gitattributes 让首次 CRLF/编码文件出现虚假差异;这不复刻宿主 clean/smudge 语义。用户在沙盒内主动改动这些规则仍受原生隔离约束。
  • status / diff 比较当前快照与沙盒索引/提交。后续宿主编辑会作为工作树差异出现;恢复文件事务后,Git 也会看到相应工作树差异。
  • 暂存、提交、分支等仓库元数据发生变化时,需要审批保存。仅查询状态/差异/日志不触发审批;关闭可选锁及 diff 自动刷新索引,避免缓存刷新产生审批。
  • 宿主文件仍使用现有文件/目录事务;沙盒仓库修订在 stateRoot/git 下独立保存。命令结果、审计和 sandboxOperation 查询分别显示 writeback 与 git.persistence。

宿主 .git、历史、索引、远程配置、凭证及 hook 均不导入,宿主 .git 不写回。 因此,首次沙盒状态为干净并不代表宿主仓库干净,沙盒 log 也不表示宿主历史。工具描述、能力状态、结构化结果和文本结果都明确标注这一差别。宿主 worktree 的 .git 文件同样排除。

运行时与边界

toolchains.ts 默认使用应用资源中的固定版本 Git;维护者仍可显式导入 cmd/git.exe、bin/git.exe 或实际的 MinGW/UCRT x64 git.exe 覆盖它。导入器只读取 PE 导入表,递归复制该主程序实际依赖的本地 DLL;不在宿主执行选中的程序。PE 依赖分析使用已经复制的同一份字节。导入失败不会替换已有注册项。

每次执行重新校验清单及全部文件摘要,复制到原生只读 ACL 约束的工具目录。不复制 Git Bash、网络辅助程序、SSH、签名程序或凭证管理器,也不继承宿主 PATH 和环境。Git 不是依赖缓存类型;dependencies 继续只允许 Node/Python。

原生环境指定私有 HOME、空系统/全局配置、禁止交互凭证提示、空模板/默认 hook 目录,以及默认关闭 hook、fsmonitor、凭证助手、提交/标签签名和自动维护。默认禁止全部 Git 传输协议,包括本地 file 传输。上述 Git 配置属于默认兼容策略,沙盒内命令主动修改参数或环境仍受同一 AppContainer/Job 约束;真正的宿主访问和联网边界来自原生隔离。没有新增网络 capability。

GIT_DIR 指向当前 stage 的 repository,GIT_WORK_TREE 指向 workspace。需要实际工作区 .git 目录或宿主绝对仓库路径的第三方工具尚未兼容。未执行的 Git 子命令、Git Bash 脚本、submodule、LFS、原生插件、交互编辑器及版本矩阵不因本轮测试通过而声称可用。

保存、策略与恢复

仓库修订位于 stateRoot/git/<workspace-sha256>/objects/<uuid>,清单绑定规范工作区、策略内容指纹及每个文件的摘要。活动引用原子替换;同工作区执行队列之外,再使用跨维护进程的 repository.lock 防止重复操作。工作区之间不共享仓库对象。

首次合成基线只写沙盒内部状态。用户命令产生的候选修订先保存独立文件及清单,并在运行目录写入 git-candidate.json,然后将候选身份和文件变更摘要共同绑定审批。保存前核对活动引用、策略和完整初始工作区快照。审批期间外部编辑、策略变化、索引/运行时损坏均拒绝旧操作。命令失败、超时、取消或审批拒绝,不发布该命令的仓库变更。

新策略可能禁止旧历史中的某些文件,因此任何策略指纹变化都会拒绝加载旧仓库,要求维护者先查看 git-state,再显式 git-reset。不会自动丢弃原有历史。git-reset 归档活动引用;此前修订仍留在状态目录,新的基线重新按当前策略过滤。

单次仓库修订上限:30,000 项、256 MiB,总清单 8 MiB,单文件 32 MiB;链接、硬链接、特殊文件、ADS/设备路径、外部 alternates、commondir/gitdir 及遗留 .lock 文件拒绝保存。这里不是 OS 磁盘硬配额;旧修订、未发布候选及运行记录尚无自动保留清理,长期磁盘管理仍待补齐。

宿主文件事务与私有 Git 引用发布是两个持久化步骤,不保证跨步骤原子性或断电级耐久性。 文件事务成功而 Git 发布失败时,结果保留真实 writeback: committed、事务 ID,并单独报告 git.persistence: failed。此时可查询运行/候选记录,并按现有事务恢复文件;不能根据原生命令退出码推断两者都已保存。进程异常退出可能留下 repository.lock;先核实记录中的 PID 已退出,再由维护者处理该锁,当前不做自动抢锁。

维护入口

以下命令供维护者查询或覆盖版本使用,普通用户无需执行 Git 导入。C:\YCodeData\sandbox 是示例,应替换为该应用实际 userData 下的 sandbox。验证只使用隔离夹具,没有修改用户生产配置或重启窗口。

npm run sandbox:maintain -- toolchain-add git --source "C:\Program Files\Git\cmd\git.exe" --state-root "C:\YCodeData\sandbox"
npm run sandbox:maintain -- toolchains --state-root "C:\YCodeData\sandbox"
npm run sandbox:maintain -- git-state --workspace "C:\Project" --state-root "C:\YCodeData\sandbox"
npm run sandbox:maintain -- git-reset --workspace "C:\Project" --state-root "C:\YCodeData\sandbox"

模型工具参数示例:

{"command":"git status --short && git diff","runtimes":["git"]}

Node 捕获 Git 子进程输出时,继续按已有显式适配器规则执行:

{"command":"node --require \"%YCODE_SANDBOX_PROCESS%\" script.cjs","runtimes":["node","git"]}

验证与遗留工作

专项入口为 npm run test:sandbox:git,使用独立 userData/state/workspace、真实 AppContainer 和本机 Git for Windows 2.55.0.windows.5。夹具宿主仓库包含曾提交后删除的假 .env,验证其内容及宿主历史未进入沙盒;所有宿主 Git 初始化/提交均只作用于生成的夹具,未操作 YCode 自身历史。

真实生产 Electron/preload/main → OMP RPC → 本地确定性模型 → execute_command → 原生 Git → 聊天审批 → 文件事务/仓库保存 → 后续读取及持久结果查询,也有独立验收。构建/报告及摘要汇总见 .tmp/sandbox-git-integration-validation.json。

0.3.0 首批接入时完整构建/类型检查通过,6 组共 207 项通过;0.4.0 内置版本的新增与复核结果见内置分发记录:

专项 通过项 报告
Git 43 .tmp/sandbox-git-YDNhf3/report.json
原生隔离 52 .tmp/sandbox-regression-wZty7E/report.json
策略/授权 38 .tmp/sandbox-policy-6AgDYV/report.json
Node/Python 工具链及依赖 24 .tmp/sandbox-toolchain-mH9fP5/report.json
Node/Python 进程兼容 20 .tmp/sandbox-process-IPJvWP/report.json
真实生产 Electron/OMP 30 .tmp/sandbox-app-pBc7pP/report.json

另实测维护 CLI 的 Git 导入、列举、仓库查询与重置。将 sandbox:maintain 改为单一 Node 启动器,避免 npm 因前置 cmd shim 给参数双重转义;安装路径、状态目录和工作区含空格、中文及字面量 ^ 的场景通过。测试期间未接触生产沙盒配置,也未重启用户窗口。

尚未接入:宿主原有仓库的安全只读历史/索引导入、宿主 .git 的审批事务、远程协议及授权凭证、持久可写工作区、完整 Git 子命令/多版本兼容、自动清理、标准用户/安装包矩阵、原版同场景 REA 比较。后续导入原仓库时必须解决对象库/packfile 中的受保护历史,不能直接复制整个 .git。

0.7.0 后续增量(2026-10-18)

以上是 0.3.0/0.4.0 历史记录,保留当时的范围和报告,不再代表当前缺口。宿主 Git 导入、.git 元数据组事务、长期 Git 草稿、远程 HTTP(S)/SSH 和凭证现在已在完整接入记录中完成工程实现;当前 0.7.0 验收矩阵、限制和 29/25/40/52 新专项结果见专用矩阵。