2

我一直在使用子模块将项目包含在“超级项目”中。
尽管我在一个超级项目中多次包含相同的子模块,但我遇到了烦恼。

例如,假设我有一个名为Helpers.
然后我有一个项目,GeometryHelpers它包括Helpers一个子模块。
然后我有另一个称为AlgebraHelpersHelpers模块的项目。

到目前为止一切顺利,这让我可以重用我的Helpers代码。

但是,现在说我有一个名为的项目Math,它具有子模块GeometryHelpersAlgebraHelpers子模块。
现在我有两份Helpers(Math/GeometryHelpers/HelpersMath/AlgebraHelpers/Helpers)。
如果我必须更改 中的某些Helpers内容,那么我必须确保不要忘记在两个地方都更新它,否则我可能会期望事情不同步。

Helpers如果发生变化(经常发生),我当前的更新过程是:

cd Math/GeometryHelpers/Helpers; git pull
cd ..; git add -u; git commit; git push # update the pointer to Helpers in GeometryHelpers
cd ../AlgebraHelpers/Helpers; git pull; 
cd ..; git add -u; git push # update the pointer to Helpers in AlgebraHelpers
cd ..; git add -u; git push # update the pointers to AlgebraHelpers and GeometryHelpers in Math

似乎理想的情况是拥有 Math/Helpers,并拥有Math/AlgebraHelpersMath/GeometryHelpers使用相同的Math/Helpers.
但是要设置这样的东西,似乎很难保持以AlgebraHelpers独立方式构建的能力(即不在数学内部)。

我真的不想构建库并将它们安装在系统上的某个地方,因为当我在工作并GeometryHelpers想要更新某些内容时Helpers,我必须打开Helpers项目,构建库并将其安装到任何地方GeometryHelpers为了它。
这不是一个特别顺利的过程,尤其是因为Helpers经常变化。

有没有更好的方法来处理这个?
我使用 CMake 作为我的构建系统,所有这些项目都是 c++ 项目。

4

1 回答 1

0

一种方法是停止在(Algebra|Geometry)Helpers级别记录 Helpers SHA1(即不要在此处初始化子模块)并将其记录在数学级别(在Helpers此处添加为子模块)。
但这不切实际,因为各种提交(Algebra|Geometry)Helpers永远不知道Helpers应该使用什么 SHA1。

另一种选择是检查脚本git new-workdir(自 git1.7.10 以来的任何 git 发行版的贡献)是否有助于避免Helpers子模块的重复。
请参阅“使用 Git 复制子模块”。

您仍然需要提交并推送每个父存储库,但至少您将Helpers在所有父存储库中只使用一个。

于 2012-09-25T14:56:14.383 回答