繁体   English   中英

如何有效地使用git存储库/子模块用于具有多个依赖项的C ++产品?

[英]How to effectively use git repositories / submodules for a C++ product that has many dependencies?

我对Git很新,还在搞清楚......我想我终于理解了整个分支/合并方面。 但我仍然不确定处理项目依赖性的最佳解决方案是什么。 什么是最佳做法? 这必须是一个常见问题,但我找不到一个好的教程或最佳实践。

假设我有一个依赖于其他几个C ++库的C ++产品,最终构成了一个复杂的依赖图。 图书馆如:其他内部开发的C ++库,公共开源库,现成的闭源库

最终的C ++产品的源代码依赖于其依赖项的输出以进行编译。 这些产出包括:

  • 一系列C ++头文件(注意C ++实现文件不存在)
  • 一组已编译的二进制文件(LIB文件,DLL文件,EXE文件等)

我的理解是我应该将每个库都放在自己的存储库中。 然后听起来像Git的子模块主要是我们正在寻找的。 http://chrisjean.com/2009/04/20/git-submodules-adding-using-removing-and-updating/上的文章似乎是一个很好的介绍,我几乎可以理解。 例如,我可以将我的主项目存储库引用到特定的外部Git存储库作为子模块/依赖项。 C ++代码可以在相应的子模块目录中“#include”头文件。 主产品/存储库中包含的构建脚本可以设想继续递归编译所有子模块。

好了,现在问题是:

您通常如何缓存每个存储库的二进制文件? 我们的一些依赖项需要数小时才能编译,并且不会经常更新。 通过上面的方案,我可以从服务器克隆/检查一个高级项目来修复一个小bug。 据我了解,我也被迫克隆构成这些开源依赖项的所有数千个文件 - 我担心这可能需要一些时间(特别是在Windows上)。 更糟糕的是,我不会被强制重新编译每个子模块,即使几个月没有人改变过这个子模块吗? (似乎每个开发人员计算机上的某种本地“哈希表”方案将变更集ID链接到一组已编译的二进制文件将会很方便...)

(我之前在几年前工作过的一家商店使用的是Mercurial - 但是所有代码 - 内部项目等等都被整合到一个巨大的巨型存储库中,你必须在一个巨大的单片构建脚本中构建所有东西 。从服务器克隆新创建的分支。当我们完成修复/新功能并与上游合并时,我们删除了该特定分支的本地存储库。)

我们正在Windows上进行开发,但最终将分支到其他非Microsoft平台 - 因此可移植性非常重要。

通常这是一个坏主意,但为什么不检查子模块中的二进制文件以及不经常更改的子模块的编译代码? 这样,获取将拉下垃圾箱,当您使用更改的二进制文件编译新版本的依赖项时,您将看到二进制文件显示在git status输出中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM