07/Documentation
更改:查看 agent 修改了什么
Agent 在其工作区中所做的更改:已更改的文件、diff 以及最新 commit,可在窗格或仪表板中查看。只读 git、嵌套仓库,以及决定扫描范围的两项设置
“更改”视图显示自上次提交以来工作区 git 仓库发生的变化。在 agent 工作时,你可以在手机上查看:修改的文件、增加和删除的行数,以及带有语法高亮的文件 diff。如果 agent 已经提交,它会显示最后一次提交。
注意。“更改”仅作读取。它绝不会暂存、提交、编辑或检出文件(下方)。
打开它
有两种进入方式。
- 从窗格进入。 点击窗格操作栏上的“更改”按钮,即 Switch 标记左侧的图标。该列表涵盖窗格的整个工作区,并标记出窗格自身的仓库。
- 从仪表盘进入。 点击仪表盘页脚中的变更,位于窗格和焦点旁边。它会为每个工作区显示一行,包括已修改文件数以及增加和删除的总行数。没有更改的工作区仍保留在原位,呈暗淡状态。点击某一行可打开该工作区的列表。
仪表盘计数每 5 秒刷新一次,且仅在“更改”标签页显示在屏幕上时刷新。所选标签页在各设备上单独保存。
列表
该列表按 git 仓库对修改的文件进行分组。每个文件都会显示其状态及其+added −removed行数统计。
| 状态 | 含义 |
|---|---|
| 已修改 | 已跟踪的文件发生了更改 |
| 已添加 | 新文件,已暂存 |
| 已删除 | 已跟踪的文件已移除 |
| 已重命名 | 文件已移动;其 diff 会标明旧路径 |
| 未跟踪 | git 尚未跟踪的新文件 |
- 基准为最新一次 commit。 暂存与未暂存的更改会一并显示。无任何 commit 的仓库会与空树进行比较。
- 新文件 显示为全部新增行。新文件夹 只显示为一项:Collie 仅提示该文件夹为新增,不列出其中的文件。这样可以避免把刚生成的
node_modules混入列表中。 - 二进制文件 会列出,但不显示其具体行内容。
- 当前窗格。 从窗格打开且列出多个仓库时,窗格所属的仓库会带有 当前窗格 标签。首次加载时,列表会自动滚动到该仓库。
- 列表或树状图。 布局 开关可将文件显示为按仓库划分的扁平列表,或显示为文件夹树。
- 过滤文件。 过滤按钮可按路径文本和状态筛选列表。随后列表会显示当前展示了多少个文件。
查看 diff
点击文件以查看其 diff。上一个文件 和 下一个文件 可在列表中逐项切换,无需返回列表。
- diff 会显示双列行号栏、着色的增删行,并对长行自动换行。
- 常见语言支持语法高亮:TypeScript、JavaScript、JSON、CSS、HTML、Markdown、Python、Go、Rust、shell、YAML、TOML 等。其他语言的文件,或超过 2000 行的 diff,保持纯文本显示。
- 极长的 diff 会在达到上限时截断并提示说明。
- 若 agent 在你查看文件时将其还原或 commit,diff 仍会留在屏幕上,其头部会显示 不再处于更改状态。视图绝不会自动跳出。
最新一次 commit
Agent 通常会自动 commit 自己的工作,因此在你想要查看更改时,列表可能恰好为空。对于没有未提交更改的仓库,视图会提供 显示最新一次 commit。
commit 视图显示主题、作者、时间、短哈希以及该 commit 涉及的文件,每个文件均带有各自的 diff。它将此 commit 与其第一个父提交进行比较,因此 merge 会显示合并引入的内容。该视图仅读取最新的 commit,不提供历史记录浏览器。
- 当 agent 再次 commit 时,界面会静默显示 存在更新的提交 等待点击。屏幕上的文件不会在你查看时自行变动。
- 当出现新的未提交更改时,新的未提交更改 会带你返回列表。
保持最新状态
页面可见时,打开的 Changes 屏幕每 5 秒重新读取一次 git。在 diff 页面上,当前打开的文件也会被重新读取。未发现新内容的重新读取不会改变屏幕上的任何内容:滚动位置、过滤条件和折叠的文件夹均保持原样。
- 隐藏的页面会停止读取,并在重新可见时读取一次。
- 刷新按钮会立即读取。
- 如果连续两次读取失败,页眉会显示 未更新,并保留上一次正常的列表。下一次成功读取会清除该提示。
哪个文件夹以及哪些仓库
该列表覆盖窗格的 工作区,而不仅是窗格自身的文件夹,因此同一工作区中的每个窗格都显示相同的列表。页眉会标出工作区及其文件夹。Collie 按以下顺序选取该文件夹:
| 顺序 | 文件夹 |
|---|---|
| 1 | 多路复用器维护的工作区专属文件夹:Herdr 的 worktree、tmux 的会话文件夹 |
| 2 | 包含该工作区所有窗格的最深层文件夹 |
| 3 | 窗格自身的文件夹(当前两项为 /、主目录或更高层级时) |
随后 Collie 找到包含该文件夹的仓库。它还会在该文件夹下的各级目录中查找仓库,即使这些仓库被父仓库忽略也会查找。这就是为什么即使工作区仓库忽略了内部的成员仓库,依然能显示每个成员仓库更改的原因。
两项设备级设置用于控制该搜索。两者都位于 设置 → 设备 → 更改 中。
| 设置 | 默认值 | 作用 |
|---|---|---|
| 在此文件夹内查找仓库 | 开 | 同时列出工作区文件夹下方各文件夹中的仓库,即使父仓库忽略了它们也会列出 |
| 查找深度 | 2 | 在工作区文件夹下方进行搜索的文件夹层级数,范围为 1 到 4 |
搜索从不追踪符号链接。它会跳过以点开头的文件夹以及 node_modules、dist、build、vendor 和 target。搜索会在达到 20 个仓库或 5000 个文件夹条目时停止。
当搜索达到设定的深度且更深处仍有仓库时,列表末尾会显示 "Stopped at 2 levels, with repos further down." 以及一个 在 Settings 中加深查找 链接。当达到仓库数量或条目上限时,列表末尾则会显示 "The list hit a limit",因为可能会遗漏文件。
搜索找到的子模块或嵌套仓库会作为独立仓库显示一次。超过深度限制的子模块则作为父仓库中的一个条目显示。
只读且安全
Changes 仅运行 git 进行读取,不执行其他任何操作。
- 它从不暂存、提交、编辑或检出。它甚至不会刷新 git 的索引缓存。
- Collie 读取仓库时,绝不会运行仓库自带的 hook、过滤器、外部 diff 程序和文本转换工具。智能体可能克隆了任何内容,而你只是点开了 Changes。
- 它从不连接网络,甚至不会为部分克隆获取缺失的文件。该文件随后会显示为零计数和空 diff。
- 仅为搜索找到的仓库中、由 git 自身列为已更改的文件提供 diff。
完整规则见 ADR 0065。
跨 crew
在 crew 中,另一台机器上的窗格或工作区由该机器进行读取。lead 转发请求,由该机器的 git 做出响应。该机器必须运行 Collie 1.13.0 或更高版本。
限制
- zellij 窗格没有 Changes 按钮。 zellij 不报告窗格的文件夹。zellij 工作区的仪表盘行显示为 "No folder"。
- 在拥有该窗格的机器上运行 必须安装 Git。
- Git LFS 文件可能会显示为已修改。 过滤器关闭时,Collie 会将 LFS 文件与其指针进行比对。它只会显示过多变更,绝不会隐藏变更。
- 一个工作区对应一个文件夹。 若工作区包含的主目录内互不相关的文件夹下的窗格,则读取请求窗格自身的文件夹,而非合并视图。