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

85 lines
9.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 沙盒 Git 接入(2026-10-18)
当前组件版本为 **0.4.0 / protocol 1**。Git 现在默认随 YCode 提供,普通用户无需安装或注册;内置来源、构建和打包验证见[内置分发记录](沙盒内置Git分发-2026-10-18.md)。已接入真实 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`。验证只使用隔离夹具,没有修改用户生产配置或重启窗口。
```powershell
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"
```
模型工具参数示例:
```json
{"command":"git status --short && git diff","runtimes":["git"]}
```
Node 捕获 Git 子进程输出时,继续按已有显式适配器规则执行:
```json
{"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 和凭证现在已在[完整接入记录](沙盒Git完整接入-2026-10-18.md)中完成工程实现;当前 0.7.0 验收矩阵、限制和 29/25/40/52 新专项结果见[专用矩阵](沙盒Git接入验收矩阵-2026-10-18.md)。