假设我有 4 个带有 C 文件的 git 存储库。其他库所依赖的基础存储库
pair
声明了一个类型。
pair.h
:
typedef struct {
int a;
int b;
} PAIR;
另外两个存储库
add
和 multiply
定义了对此类型的操作,并且都包含 pair
作为子模块或子树:
add.c
:
int add (PAIR p) {
return p.a + p.b;
}
multiply.c
:
int multiply (PAIR p) {
return p.a * p.b;
}
最后一个存储库
calc
,其中包含 add
和 multiply
作为子模块或子树,包含使用这两种操作的程序。
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
的目录树中包含两次,尽管它只需要一次。如果实际结构变得更加复杂并具有多个依赖阶段,则会导致磁盘空间的巨大浪费。
如何以磁盘空间友好的方式组织它?
对我来说,每个存储库只有一个“当前版本”可以使用就很好了。
假设
calc
、add
和multiply
都可以使用相同版本的pair
,我会声明add
、multiply
和pair
作为calc
的子模块。
我会从
pair
和 add
中删除 multiply
:这两个可以在其存储库之外查找 pair
(../pair
而不是 ./pair
)。
这样:
calc
pair
calc
负责获取 pair
、add
和 multiply