0

在我们公司,我们通过堆积几个框架/库来制作项目:

/Framework
/Extensions (depends on Framework)
/Business (depends on Framework & Extensions)
/Project A (depends on Framework & Extensions & Business)
/Project B (depends on Framework & Extensions & Business)
/Project C (depends on Framework & Extensions & Business)
/...

到目前为止,我们正在使用一个包含所有项目和框架的大型 git 存储库,并且我们正在使用git subtree来拆分框架以发布它(它是开源的)。

我们希望能够将这个大存储库拆分到不同的项目中,但是有这么多递归依赖项的事实让我担心:

AFAIK,两个 git 子模块/git 子树都要求所有库代码都在主存储库中,所以我们最终会得到这样的项目结构:

/Framework
/Extensions/Framework 
/Business/Extension/Framework
/Project A/Business/Extensions/Framework
/Project B/Business/Extensions/Framework
/Project C/Business/Extensions/Framework

我们不喜欢到处都有这么多的框架副本,也不喜欢框架文件夹在层次结构中如此深入。

我们想要的是项目 A 存储库在拉取时断言存在与当前包含一些 SHA的存储库并排,并检查此 SHA。

有没有办法让 git 子模块/子树并排?

4

1 回答 1

0

您尚未描述您的开发环境,但您所描述的内容听起来与在 Linux /usr/lib 和 /usr/include 中开发具有依赖关系的代码并没有太大的不同。许多项目依赖于共享库;为了将这些项目编译成可执行文件,需要安装项目所依赖的库(框架和扩展)的稳定版本。

在您的情况下,让我们假设框架、扩展和业务都是稳定的(或者至少只是不经常更新)。您将拥有三个结帐,例如:

cd /stable
git checkout -b version-x.y /path/to/Framework.git
git checkout -b version-x.y /path/to/Extensions.git
git checkout -b version-x.y /path/to/Business.git

由每个开发人员执行,以便在他们的开发机器上获取这些“库”。每个项目都有引用这些库的构建/制作指令。(引用可以是绝对的 /stable/... 或相对于“项目 X”位置。)扩展对框架的依赖和业务对扩展和框架的依赖是相似的。

使用这种方法,每个克隆只有一个,但所有依赖项都已到位。

[编辑] 如果每个项目都需要修改它所依赖的东西,上述内容将不起作用;如果是这种情况,那么您将无法避免多次克隆所有内容。而且,事实上,最好使用子模块进行克隆,以确保在适当的时候可以将一个项目的更改合并回主模块。

于 2012-06-20T23:23:44.830 回答