防止子模块重复,同时保持可分离性并允许项目组合

时间:2012-09-25 14:00:15

标签: git cmake

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

例如,假设我有一个名为Helpers的项目 然后我有一个项目GeometryHelpers,其中包含Helpers作为子模块 然后我有另一个名为AlgebraHelpers的项目,其中包含Helpers作为子模块。

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

但是,现在说我有一个名为Math的项目,其中GeometryHelpersAlgebraHelpers为子模块。
现在我有两份HelpersMath/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/AlgebraHelpersMath/GeometryHelpers使用相同的Math/Helpers。 但是要设置这样的东西,似乎很难保持以独立方式构建AlgebraHelpers的能力(即不在数学内部)。

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

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

1 个答案:

答案 0 :(得分:0)

一种方法是停止在(Algebra|Geometry)Helpers级别记录助手SHA1(即不在那里初始化子模块)并将其记录在数学级别(在那里添加Helpers作为子模块) 。
但这是不切实际的,因为(Algebra|Geometry)Helpers的各种提交都不会知道应该使用Helpers的SHA1。

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

您仍然需要提交并推送每个父回购,但至少在所有父回购中只使用一个Helpers