Skip to content

fix(git): 跳过忽略或排除目录内的普通子仓库 - #1659

Open
lin-coco wants to merge 12 commits into
1lck:previewfrom
lin-coco:codex/git-discovery-exclusions
Open

lin-coco wants to merge 12 commits into
1lck:previewfrom
lin-coco:codex/git-discovery-exclusions

Conversation

@lin-coco

@lin-coco lin-coco commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

修复被 Git 忽略或手动排除的目录内,普通子仓库仍自动进入 Commit、分支和 Git Log 的问题。

Fixes #1657

依赖 #1658。两份 PR 均指向 preview;先合并 #1658,再整理本 PR 基线。只看本组差异。

改动

  • 自动发现遵循原生 Git 忽略和已保存的手动排除,多根分别使用自己的配置;保留显式根、真实子模块及父仓库正常提交范围。
  • Windows 路径比较统一普通路径、扩展前缀、UNC 和大小写;修复嵌套根委派、大小写改名后的排除,以及子模块相对路径提取。原生 I/O 和索引键不变,Unix 合法冒号目录继续有效。
  • 忽略目录候选复用库存可见性与 linked-worktree 边界,支持默认隐藏、取消内置隐藏和自定义规则;两端使用各自库存实际采用的规则。
  • 两端在规则、标记和根集合变化后重发现,清理旧选择与历史状态;失败保留成功快照,拒绝迟到结果。
  • 子模块索引继续流式读取;每轮保留双流读取、取消和清理边界,仅在没有读取进展时等待;Unix 使用管道可读通知,避免短暂读空后的固定等待,不提高预算。
  • 同步契约、两端桥接、fixture、测试、笔记和功能矩阵。

IDEA 社区版依据与截图

参考 VcsRootScanner和 VcsRootErrorsHandler:自动注册时过滤忽略或排除路径,显式管理的仓库保留。

以下为既有 Lithe-Dev 实拍:排除目录内的子仓库没有进入提交范围,父仓库改动保留;不作为本轮新 head 的完整原生验收。

排除目录
提交范围

验证

已同步 preview 20ef1317,本组 head 536c7aed。

  • Core 1,596 项全量逐项计时、Git Host 10 项、Swift 318 项、前端 88 项及 TypeScript 通过;完整 Rust/Swift 桥接、架构、契约、i18n、稳定性、笔记、矩阵和 bundle 只读门禁通过。
  • 候选可见性回归已验证修复前失败、修复后通过;补齐 Windows 路径、大小写改名和子模块回归。独立审查发现的相对路径问题已修复并复审。
  • 33 MiB 用例此前仅取消有进展时的等待,本机虽降至 3.54 秒,macOS CI 仍在原 12 秒截止处失败。补修 Unix 可读通知后,本机为 30 ms,大输出取消为 19 ms;数据规模与预算不变,完整 Rust/Swift 桥接及独立审查再次通过。最终 head 的 macOS CI 此用例 14 ms,Rust Core 任务通过。1,000 个目录、10,000 个文件、20 个子仓库的合成发现三次为 658/269/309 ms,Git 进程 20/19/19 个,均保留预期 6 个仓库。这是本机 Core 组件数据。

本机 Swift 6.4.2 / Xcode 27.2;Windows host 的 macOS 检查仅报原基线两项 Windows API 错误,不算原生通过。最终 head 的 Swift 6.3.3 / Xcode 26.6(3,719 项)、Rust Core、Windows Rust/前端和远程工作区 CI 已通过,路径与嵌套根回归有 Windows 原生证据。真实 JDT 与插件完整测试在上一 head 通过,本次按分类跳过;Windows 界面和本轮 Git 面板原生复验 pending,后者因自动化超时未完成。

旧 Windows Rust 任务注解确认超过 45 分钟上限,共享 Core 步骤先失败但日志已不可取,因此不把该取消冒充已定位修复,也不增加 job 预算。

最终 CI 的 arm64 发布包任务在未改动的 WebKit 探针失败,macOS 总门禁因此仍失败:plugin worker never published comment tokens。该探针不链接 Rust,相关源码与已全绿的 #1658 一致;本机该插件用例通过,后续悬停可见性用例失败。保留失败证据,不扩大期限或跳过检查。当前账号对上游仅有 READ 权限,单独重跑已被 GitHub 拒绝,需要维护者复核这一发布包任务。两项依赖可见桌面的 Swift 测试及 Windows 外部环境测试按原条件跳过,原生 UI 验收仍为 pending。

Fix automatic analysis exclusion for ignored nested repositories while preserving independent Git commit candidates. Add ignored-directory suggestions, selective exclusion and project-local dismissal on macOS and Windows. Distinguish ignored names from excluded rows and refresh lazy tree decorations safely across concurrent events. Include shared contracts, localization, regression coverage and native acceptance notes.
Use the Islands FileColor.Yellow theme overrides for excluded rows on
macOS and Windows: #FFF9EB in light mode and #291F1C in dark mode.
Preserve the existing priority of selected row backgrounds.

Update the rendered row expectations, upstream theme evidence in the
workspace exclusion decision note, and the platform feature matrix.

Validation: 16 related Swift rendering/tree interaction tests passed;
Release build and isolated static gates passed. Installed Lithe-Dev
visually confirms matching folder/descendant colors in Lithe-test;
signature and bundle immutability checks passed after launch.
Windows native and macOS dark appearance acceptance remain pending.
@ghfind-review ghfind-review Bot added the review: medium ghfind author score; see https://ghfind.com label Nov 2, 2026
@lin-coco
lin-coco marked this pull request as ready for review November 2, 2026 13:10
@lithe-code-review

lithe-code-review Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Lithe Review

结论: ⚠️ 有建议
范围: preview ← codex/git-discovery-exclusions · head: 993a32c

未发现需要阻塞合并的问题。发现两项 P2 非阻塞问题。

Findings

  1. [P2] 按 Windows 路径身份匹配手动排除
    rust/lithe-core/src/git/repository_discovery.rs:65

    • 实际影响:保存的手动排除会因目录名称大小写变化而失效,普通子仓库重新进入 Git 面板,但索引仍将其视为已排除。
    • 触发条件:Windows 上,保存的标记路径与实际目录名称仅大小写不同。这里直接使用区分大小写的 Path::starts_with,而现有索引 contains 和前端目录标记按 Windows 路径身份匹配。
    • 可构造复现:创建 cache/child 仓库,将 cache 手动排除;在应用外经临时名称将目录改为 Cache,保持保存的标记不变,再刷新。Cache 不匹配 root.join("cache"),扫描会进入其中。
    • 来源:本次引入;新增的手动排除过滤没有沿用既有路径身份规则。
  2. [P2] 忽略目录候选应排除已被库存过滤的目录
    rust/lithe-core/src/project/indexing.rs:138

    • 实际影响:提示条会把原本就不参与分析和搜索的目录列为“仍参与分析”的候选,产生无效排除建议;扫描也会进入库存已跳过的目录。
    • 触发条件:关闭 Git 自动分析排除,项目包含被 Git 忽略的内置隐藏目录,例如 node_modules。新扫描只跳过 .git,没有应用 VisibilityRules::is_hidden。
    • 可构造复现:保持默认可见性规则,创建 node_modules/example.js,在 .gitignore 添加 node_modules/,关闭自动排除并打开 .gitignore。新接口会返回 node_modules,但 files.rs 的库存遍历通过 visible_child 已将其过滤。
    • 来源:本次引入;新增候选扫描与现有库存的资格判断不一致。

Scope Check

  • 关联需求:实现基本覆盖 [Bug] 已忽略或排除的目录中,子仓库仍出现在 Git 面板 #1657 的忽略、手动排除、显式根和真实子模块场景;Windows 大小写边界仍有遗漏。
  • 已完成范围:共享发现规则、两端刷新与迟到结果保护、目录提示和装饰,以及相关契约、fixture、测试、笔记和矩阵。
  • 上游复用:忽略与索引事实继续由原生 Git 提供,进程执行沿用既有所有者。
  • 两项 Finding 均由本次改动引入,属于本次职责范围。

Suggestions

  1. 手动排除匹配复用现有平台路径身份规则,保留路径组件边界及大小写敏感平台语义;补充 Windows 大小写变化回归。
  2. 候选扫描复用库存的有效可见性过滤,并覆盖默认隐藏目录及用户取消隐藏的情况。
  3. 补充受影响界面的前后对比,以及新增提示和 Windows 界面的截图。上下文已有两张 Dev 修复后截图链接,但不足以覆盖这些变化。

Summary

共享逻辑与平台编排的边界清晰,失败保留快照和异步失效保护有对应测试。主要遗漏在路径身份和候选资格的一致性,建议补齐这两处边界。

Verification

  • 静态检查指定提交范围内的 Git 发现、索引和目录列表、进程流式读取、Swift/React 刷新与提示链路,以及相关测试、契约、fixture、i18n 源词条、笔记和 CI 注册。
  • 作者报告 Core 1,590 项、Swift 317 项、前端 84 项、TypeScript、Git Host 和桥接检查通过;本次未独立执行。
  • 已提供的 head 检查快照中,Windows 检查仍在运行,Swift/Core 等部分检查跳过,不能据此认定完整 CI 已通过。
  • 本次未运行代码、测试、i18n 或 bundle 只读验证,也未访问截图链接。
  • 仍缺固定 Swift 工具链、Windows 原生界面及大型目录查询耗时的完整验收证据;视觉效果尚未验证。

@lithe-code-review

Copy link
Copy Markdown

Lithe 运行验收

版本:993a32c3efd00c5c14a3071f2bcaaa997d17c976;状态:blocked。
本报告独立于代码审查;只报告实际执行的场景,不代表所有问题均已修复。

External fork runtime requires an explicit trusted execution policy; no code executed

工作副本与运行状态已清理;可复用编译缓存按 12 GiB / 7 天预算保留。
详细步骤和原始证据保存在服务器受限目录(14 天、总计不超过 1 GiB);当前没有公开下载链接。

@lithe-code-review

Copy link
Copy Markdown

Lithe 运行验收

版本:e70a04ad37048aa47c7a593ddfbe7528897e3ae5;状态:blocked。
本报告独立于代码审查;只报告实际执行的场景,不代表所有问题均已修复。

External fork runtime requires an explicit trusted execution policy; no code executed

工作副本与运行状态已清理;可复用编译缓存按 12 GiB / 7 天预算保留。
详细步骤和原始证据保存在服务器受限目录(14 天、总计不超过 1 GiB);当前没有公开下载链接。

@lithe-code-review

Copy link
Copy Markdown

Lithe 运行验收

版本:536c7aed69098974a60b2151f0636987e34da9a9;状态:blocked。
本报告独立于代码审查;只报告实际执行的场景,不代表所有问题均已修复。

External fork runtime requires an explicit trusted execution policy; no code executed

工作副本与运行状态已清理;可复用编译缓存按 12 GiB / 7 天预算保留。
详细步骤和原始证据保存在服务器受限目录(14 天、总计不超过 1 GiB);当前没有公开下载链接。

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review: medium ghfind author score; see https://ghfind.com

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant