我一直在使用子模块将项目包含在“超级项目”中 我遇到了一个烦恼,虽然我在一个超级项目中有多次包含相同的子模块。
例如,假设我有一个名为Helpers
的项目
然后我有一个项目GeometryHelpers
,其中包含Helpers
作为子模块
然后我有另一个名为AlgebraHelpers
的项目,其中包含Helpers
作为子模块。
到目前为止,这让我可以重用我的Helpers
代码。
但是,现在说我有一个名为Math
的项目,其中GeometryHelpers
和AlgebraHelpers
为子模块。
现在我有两份Helpers
(Math/GeometryHelpers/Helpers
和Math/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/AlgebraHelpers
和Math/GeometryHelpers
使用相同的Math/Helpers
。
但是要设置这样的东西,似乎很难保持以独立方式构建AlgebraHelpers
的能力(即不在数学内部)。
我真的不想构建库并在某个地方的系统上安装它们,因为当我在GeometryHelpers
工作并希望更新Helpers
中的内容时,我必须打开Helpers
项目,构建库,并将其安装到GeometryHelpers
寻找它的任何地方
这不是一个特别顺利的过程,特别是因为Helpers
经常变化。
有没有更好的方法来解决这个问题? 我使用CMake作为我的构建系统,所有这些项目都是c ++项目。
答案 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
。