C语言复杂Git仓库依赖的磁盘空间优化方案咨询
仓库依赖结构优化问题
我拥有4个包含C文件的Git仓库:基础仓库pair定义了一个类型,其他仓库均依赖于它。
pair仓库代码
pair.h:
typedef struct { int a; int b; } PAIR;
add和multiply仓库代码
另外两个仓库add和multiply实现了该类型的操作,且均将pair作为submodule或subtree引入:
add.c:
int add (PAIR p) { return p.a + p.b; }
multiply.c:
int multiply (PAIR p) { return p.a * p.b; }
calc仓库代码
最后一个仓库calc将add和multiply作为submodule或subtree引入,包含一个调用这两个操作的程序:
calc.c:
int main (int argc, char *argv[]) { PAIR p; p.a = atoi(argv[1]); p.b = atoi(argv[2]); printf("sum = %d\n", add (p)); printf("product = %d\n", mul (p)); return 0; }
当前问题
递归克隆calc仓库时,pair会在calc的目录树中重复出现两次,而实际上仅需一份。当依赖结构更复杂、层级更多时,将造成大量磁盘空间浪费。请问如何以更节省磁盘空间的方式组织这些仓库?我可接受每个仓库仅保留一个「当前版本」开展工作。
优化方案
复用Git子模块的本地存储
Git 2.10及以上版本支持子模块共享本地仓库的对象库,避免重复存储:- 先单独克隆
pair仓库到本地固定路径,比如~/local-repos/pair - 克隆
calc仓库时,通过--reference参数让所有子模块复用已有的pair副本:git clone --recurse-submodules --reference ~/local-repos/pair <calc仓库地址>
所有依赖
pair的子模块都会共享同一个本地pair仓库的对象,不会在磁盘中重复存储相同版本的内容。- 先单独克隆
调整子树的引入层级
不再让add和multiply各自引入pair子树,而是以calc作为顶层仓库,直接引入pair、add、multiply三个子树:- 在
calc仓库中执行以下命令添加子树:git subtree add --prefix pair <pair仓库地址> main git subtree add --prefix add <add仓库地址> main git subtree add --prefix multiply <multiply仓库地址> main - 修改
add和multiply的编译配置,让它们通过相对路径(比如../pair)引用calc根目录下的pair头文件,这样add和multiply仓库自身不再需要存储pair的内容,从根源避免重复。
- 在
用包管理工具替代Git子模块/子树
将pair、add、multiply作为独立的C语言组件,用pkg-config或其他C包管理工具管理依赖:- 为
pair编写pair.pc配置文件,定义头文件路径、编译参数等信息 add和multiply的构建脚本通过pkg-config --cflags --libs pair获取依赖配置,无需在仓库中嵌入paircalc构建时,通过包管理工具将所有依赖拉取到本地共享缓存目录,同一版本的组件只会存储一次,彻底解决Git层面的重复存储问题。
- 为
内容的提问来源于stack exchange,提问作者Kolodez
相关产品推荐
相关产品推荐

