C++ 使用多个存储库的项目git子模块的替代方案

C++ 使用多个存储库的项目git子模块的替代方案,c++,git,version-control,tags,synchronization,C++,Git,Version Control,Tags,Synchronization,我有三个存储库:A,B,C(C++代码) A和B是独立的项目,两者都依赖于C。已与git子模块建立关联 我现在创建了一个新项目D,它依赖于a和B,因此现在C被引用了两次 项目结构类似于以下内容: D |--A | | | C | |--B | C 由于D的不同版本对应于A和B的不同版本,因此我想在版本之间签出时有一种方法保持它们同步 我正在考虑删除子模块关联并切换到for allA、B和D。这有意义吗?是否有更好的方法只使用git 谢谢我在CMake项目中广泛使用的子模块的一个

我有三个存储库:ABC(C++代码)

AB是独立的项目,两者都依赖于C。已与git子模块建立关联

我现在创建了一个新项目D,它依赖于aB,因此现在C被引用了两次

项目结构类似于以下内容:

D
|--A
|  |
|  C
|
|--B
   |
   C
由于D的不同版本对应于AB的不同版本,因此我想在版本之间签出时有一种方法保持它们同步

我正在考虑删除子模块关联并切换到for allABD。这有意义吗?是否有更好的方法只使用git


谢谢

我在CMake项目中广泛使用的子模块的一个替代方案是将所有模块作为独立的“库”,并通过CMake命令使用它们(例如,请参见或)。每个依赖项都提供自己的查找脚本,该脚本与库一起安装,依赖项目可以使用它来本地化库

这样,项目就不直接依赖于特定的“依赖性”提交(但仍然可以依赖于特定的库版本,因为版本依赖性也可以通过查找脚本处理,例如,请参阅,如果指定,它还可以处理所需的Boost库版本)。

  • 如果您的项目
    D
    有助于回购
    A
    B
    ,您可以将它们添加为项目
    D
    的子模块

    但是,当您为project
    D
    签出特定版本时,无法同时将子模块签出到特定版本。解决方法是对
    A
    B
    标记使用
    D
    的相关版本,并执行脚本将
    A
    B
    签出到相关版本

    例如
    D
    v3.0
    是与
    A
    v1.0
    B
    v2.0
    相关的版本,因此您可以在
    A
    B
    中添加版本为
    v3.0.1.0
    的标签。当您为
    D
    签出
    v3.0
    时,您可以运行脚本将
    a
    B
    签出到以
    v3.0*
    开头的版本

  • 如果您的项目
    D
    未参与回购
    A
    B
    ,您可以删除子模块关联。来自
    A
    B
    的代码就像项目
    D
    的子文件夹一样,文件夹
    A
    和文件夹
    B
    的版本可以始终与项目
    D
    的版本同步


这是真正独立于语言的,不需要提及特定的编程语言。您好。是的,我知道,我这样做只是为了以防万一:)我知道有一些依赖于语言的工具有时可能会有所帮助。
git checkout——递归子模块有什么问题?
?我想问题可能是,您可能最终会通过不同的中间依赖关系获取同一子模块的多个版本。确切地说是@axalis。也许我会添加一些自定义git挂钩。不确定。有一个不错的git从机项目,但现在看起来很老了是的,我正在考虑为它创建一个自定义脚本。以正确的方式命名它,可以让您将其用作git扩展:)是否使用git扩展取决于您操作git repo的工具。如果您使用git命令行来操作git repo,则无法使用git扩展,您可以直接执行脚本,将所有子模块签出到相关版本。