Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
并行递归Git子模块_Git_Github_Git Submodules_Git Subtree - Fatal编程技术网

并行递归Git子模块

并行递归Git子模块,git,github,git-submodules,git-subtree,Git,Github,Git Submodules,Git Subtree,在我们公司,我们通过堆积几个框架/库来进行项目: /Framework /Extensions (depends on Framework) /Business (depends on Framework & Extensions) /Project A (depends on Framework & Extensions & Business) /Project B (depends on Framework & Extensions & Busines

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

/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子模块/git子树都要求所有库代码都在主存储库中,因此我们最终将得到如下项目结构:

/Framework
/Extensions/Framework 
/Business/Extension/Framework
/Project A/Business/Extensions/Framework
/Project B/Business/Extensions/Framework
/Project C/Business/Extensions/Framework
我们不喜欢到处都有这么多的框架副本,也不喜欢框架文件夹在层次结构中变得如此深入

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


有没有一种方法可以同时生成git子模块/子树?

您还没有描述您的开发环境,但是您所描述的内容与在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/…或相对于'Project X'位置。)扩展对框架的依赖和业务对扩展和框架的依赖类似

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


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

不幸的是,情况并非如此,我们从每个项目中不断更改框架、扩展和业务(在其自己的分支上隔离一段时间)我们喜欢这样一个事实,即这个库上的更改在项目之间无缝移动,没有严格的版本,也不能轻松地更改/调试它们(它们是同一个解决方案的一部分)。然后首选的解决方案是使用子模块,这意味着您必须有多个副本(在每台开发机器上)。在这种情况下,拥有副本是一种优势;它允许每个项目成功,然后允许更改重新合并。