为什么提到这个点,因为我修改程序a中的头文件,其实程序b中相关的头文件也需要同步修改,但是它们在两个仓库中,所以,容易出现疏漏
跨仓库共享头文件的方案
你遇到的问题本质上是代码复用与同步的问题,而且是在两个独立 Git 仓库之间。下面按推荐程度从高到低给出几种方案。
我的一个想法:
使用共同的头文件:然后目录名称也都一样,可以手动对比两个仓库中头文件的差异。
方案一:抽出公共库(最推荐)
把共享的头文件抽成一个独立的仓库,作为第三方依赖引入。
common-headers/ (独立 git 仓库) ├── include/ │ ├── foo.h │ └── bar.h └── CMakeLists.txt project-a/ (git 仓库 A) project-b/ (git 仓库 B)有待进一步思考和实践
方案二:Monorepo(如果条件允许)
把 A、B 和公共头文件放到同一个仓库里:
monorepo/ ├── common/include/ ├── project-a/ └── project-b/优点:改一处,两边天然同步;重构、搜索、CI 都简单
缺点:仓库变大,权限粒度粗,迁移成本高
适用:A、B 本来就是同一团队/同一产品线
方案三:Git Subtree(不想用 submodule 的折中)
git subtree add --prefix=third_party/common-headers \ git@xxx/common-headers.git main --squash优点:公共代码直接以普通文件形式存在仓库里,clone 的人无感知
缺点:同步需要手动
git subtree pull/push,比 submodule 更"重"
方案四:自动化检测(作为兜底)
无论用哪种方案,都建议加一道CI 防线,防止两边漂移:
哈希校验:在 A、B 的 CI 里计算公共头文件的 hash,与"官方版本"比对,不一致就报警。
定时同步检查:CI定时任务 diff 两边公共头文件,有差异发通知。
强制走公共库:如果头文件已经在公共库,直接在 A、B 里删除本地副本,只允许从公共库引入——从物理上杜绝"两份拷贝"。
第 3 点是最根本的:只要还存在两份拷贝,就一定会漂移。
待思考和实践。