TGViewer
开发者工具箱|编程·开发工具·资源 开发者工具箱|编程·开发工具·资源 @devtoolboxhub · 779 subscribers
Post #1881 4
五仓库架构踩坑:Gitlink 与双 CI

Flude 团队复盘了多仓库架构的实践代价。项目从第一分钟起就选择拆分成独立仓库,Pipeline、engine、design-docs、user-docs 几乎同时创建,.gitmodules 出现在父仓库的首次提交里。为了代码整洁、CI 隔离、独立历史和权限分离,系统从第一天就建立在 Git Submodules 之上。
第一个代价是状态同步的隐蔽机制。在 engine/ 里改代码,需要两次 push:先在子模块目录 push,再回到 Pipeline 根目录提交指向新 commit 的 gitlink 并 push。第一次 push 极易被遗忘——本地 commit 真实存在,构建通过、测试全绿,直到 CI 全新 checkout 时才暴露:git submodule update --init 报错 fatal: remote error: upload-pack: not our ref。曾有三个子模块同时踩坑,原因一致:本地提交从未离开开发者的笔记本。第四个托管站点的子模块 ude_promotion 落后上游太多,普通 push 无法修复,必须先做交互式 rebase。
第二个代价来自 CI。engine 既是独立仓库、有自己的构建流程,又是 Pipeline 里的子模块、要在父项目上下文中测试,两种身份必然冲突。先是 test_integration_scripts.py 依赖只存在于父仓库的 verify_pages/check_links 模块,独立 checkout 时文件不在磁盘上,只能在 ci.yml 里加一行 pytest --ignore 临时忽略。随后用 Path(file).resolve().parents[2] 找父级产物的测试开始失败:嵌套运行时正好升到父仓库根目录,独立构建时却跳出仓库根、进入 CI runner 的系统文件系统,直接抛 AssertionError。

点状修补失效后,团队引入通用约定:测试在上升层级检查系统标记目录(.workspace_config)是否存在。存在说明处于嵌套上下文,测试照常运行;不存在则用 pytest.mark.skipif 安静跳过,不再报红。

结论是多仓库架构不会在第一天白送松耦合,它要求无懈可击的 push 同步纪律,并迫使代码同时适配多种执行上下文。
More from @devtoolboxhub
  1. Sep 27, 2026Instagram 字体生成器:把普通文字换成 Unicode 样式 Instagram 字体生成器是一类在线工具,把普通字母转换成外观不同的 Unicode 字符,再复制粘贴到…
  2. Sep 27, 2026用一个下午审计公司里的重复性工作 多数公司不需要耗时半年的转型项目,才能发现时间到底流失在哪里。花几个小时追踪三个真实工作流,就能看出很多问题。关键不是问团队哪里效率低,也不是凭记…
  3. Sep 27, 2026竞品关键词调研的自动化流程 从竞品差距分析导出两万个关键词,约一半只是同一词换了词序。真正的瓶颈在导出之后那一小时:一个好问题变成一堵近似重复词组成的墙,外加三种不同口径的搜索量。…
  4. Sep 26, 2026PostgreSQL 复制槽上限参数 max_replication_slots 解析 max_replication_slots 决定共享内存中复制槽数组的长度,仅此而已。它不决…
  5. Sep 26, 2026Xeno Core:TypeScript 后端架构框架 Node.js 复杂系统的架构选型往往决定代码的长期命运。开发者常在两条路之间纠结:要么依赖重度使用实验性装饰器和反射(如…
  6. Sep 25, 2026用 SLO 给 AI Agent 的行为定个预算 Grafana Labs 提出把可靠性工程里的错误预算(error budget)思路用到 AI Agent 上。延迟、token…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →