我有两个项目(A& B)。他们都使用项目Common。我想将Common纳入A& B通过子模块因为我可以直接将每个提交绑定在A&他们在Common中依赖的提交。
在过去,我试图让我的团队使用这样的子模块,但我们无法让它顺利运行。我们正在从子模块本身和开发中开发公共代码。从子模块提交,但我们遇到了很多问题,我们恢复了所有项目在同一目录下(C:\ dev \ A,C:\ dev \ Common)。
我很确定我们不知道应该如何使用子模块,但是如果你不能直接在子模块中开发Common代码,那么这会不会让它更难开发?有人可以解释一下子模块的正确用法吗?
答案 0 :(得分:6)
您可以直接从子模块开发(正如我在“true nature of submodules”中所解释的那样) 但是每次在子模块中提交某些内容(并在某处发布)时,您都需要确保在父存储库中提交。
现在您有两个子模块组织:
A Common (Common could depend itself on other dependencies) B Common ...
ParentA A Common Other A dependencies ParentB B Common Other B dependencies
(实际上,如果Common
有自己的依赖关系,A
或B
将依赖于“ParentCommon
”,这将引用Common
和所有它的直接依赖)
除非您有Common
必须成为A
的子目录的结构性命令,否则我会建议第二个组织,它更接近您的C:\dev\A
,C:\dev\Common
一个。
实际上,我只选择一个深度依赖,其中对于ParentA
,我将所有依赖项(直接和间接)列为子模块。
这是因为,任何试图管理依赖项的工具,您仍需要做出以下决定:
A
取决于需要X
的{{1}}和需要Z1
的{{1}}:Y
的哪个版本想在你的项目中使用/编译?)Z2
取决于需要Z
的{{1}},而A
也选择使用X
)Z1
取决于A
,X2
依赖A
使用... B
!)答案 1 :(得分:4)
子模块不是特别顺畅的,就像你想要的那样。您可能已经注意到,要在子模块中提交项目的更改(从Git v1.7开始,可能是永久性的),您需要:
如果您正在以锁步方式开发子模块和外部项目,这很麻烦。这是“正确的方法”,在混合代码库时,更喜欢稳定的软件配置而不是简单,但在这种情况下,命令序列在病理上很长。
弹出为什么堆栈,但子步骤的锁步开发可能表示几个较大的问题之一:
这些情况都不是必然对您而言,但这些都是导致您所拥有的可怕的锁步子模块更新工作流程的问题之一。当几乎依赖共享库和头文件时,子模块可以很好地工作,但是有一些令人信服的理由(例如必须一致的奇怪的编译标志)从源代码编译。我的方法是解决这些问题,如果它们是真正的根本原因。
如果不存在这些问题,可能是git对你来说是错误的工具。我很难说,但这绝对是可能的。