为什么提到这个点,因为我修改程序a中的头文件,其实程序b中相关的头文件也需要同步修改,但是它们在两个仓库中,所以,容易出现疏漏
跨仓库共享头文件的方案
你遇到的问题本质上是代码复用与同步的问题,而且是在两个独立 Git 仓库之间。下面按推荐程度从高到低给出几种方案。
我的一个想法:
使用共同的头文件:然后目录名称也都一样,可以手动对比两个仓库中头文件的差异。
方案一:抽出公共库(最推荐)
把共享的头文件抽成一个独立的仓库,作为第三方依赖引入。
cpp
common-headers/ (独立 git 仓库)
├── include/
│ ├── foo.h
│ └── bar.h
└── CMakeLists.txt
project-a/ (git 仓库 A)
project-b/ (git 仓库 B)
有待进一步思考和实践
方案二:Monorepo(如果条件允许)
把 A、B 和公共头文件放到同一个仓库里:
cpp
monorepo/
├── common/include/
├── project-a/
└── project-b/
-
优点:改一处,两边天然同步;重构、搜索、CI 都简单
-
缺点:仓库变大,权限粒度粗,迁移成本高
-
适用:A、B 本来就是同一团队/同一产品线
方案三:Git Subtree(不想用 submodule 的折中)
cpp
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 点是最根本的:只要还存在两份拷贝,就一定会漂移。
待思考和实践。