将代码组织成Git子模块

时间:2017-12-22 23:58:35

标签: git git-submodules

我想知道Git子模块是否合适 组织我目前保留在RCS下的一些代码,如果 那么,子模块应该如何组织。

模块概要

假设我有一个库模块的集合(也许是库 单库的一部分;这是一个讨论的项目)。 假设其中一些模块是基础模块,其他模块依赖 在基础模块上。 所有这些模块都打算用于其他包装 软件(程序),可能包括适当的 选择这些包作为子模块。

为了使其具体,库模块是:

  • stderr - 标准化错误报告例程(不依赖于 其他模块)。
  • filter - 文件过滤器程序(如grepcat):使用 stderr
  • debug - 调试跟踪支持:使用stderr
  • phasedtest - 单元代码测试:使用filterdebug和 直接stderr
  • rational - 使用的有理数运算包 phasedtest代表其测试代码,但独立于phasedtest 否则就会产生依赖性。

许多其他程序使用stderr。 相当多的使用也使用filter(以及所有使用的代码) filter也直接使用stderr,但有很多 使用stderr但不使用filter的程序。 有些程序使用debug;基本上所有这些程序也使用 直接stderr,但他们可能会也可能不会直接使用filter。 使用phasedtest的单元测试程序可能会也可能不会使用stderr, 直接filterdebug(他们更有可能使用stderr而不是phasedtest 其他人),但rational本身需要它们,所以这些程序总是如此 间接使用这些模块。 有些程序可能会使用stderr;通常他们也会使用stderr (我写的几乎所有内容都使用phasedtest),但这些程序并不适用 一般来说,直接使用$HOME/lib

只是为了澄清:目前,这些潜在的Git模块和 子模块根本不在Git中;他们中的大多数都有广泛的(10-30 年份)RCS的历史(在Y2K之前的SCCS),将在以后保留 他们过渡到Git。 目的是在适当的时候将所有的回购都放到GitHub中。 通常,这些模块都相当稳定。 它们确实得到修订或扩展,但不一定每年都有。 有时,三年或更长时间没有改变其中一些。 我有一个构建/分发系统,其中的文件构成了什么 可能会成为子模块被拉入更大的分布 计划何时准备发布。 在正常(单人)发展期间,材料生活在一个 包含数百个源文件的库(单个(静态)) 库(在$HOME/inc中)和单个头目录(/usr/include, 类似于/usr/local/include或完全分开stderrfilter)。

我正在寻求获得结构"对" - 对我来说足够正确 在将它们转换为Git之前,我不会后悔我所做的事情。 我仍然需要解决版本标记和标记问题;这是一个 整个单独的包包“蠕虫”,而不是这个问题的一部分。

如何组织子模块?

根据我对子模块的理解,它似乎是:

  • stderr应该在自己的存储库中。
  • debug应位于自己的存储库中,并以stderr作为子模块。
  • phasedtest应位于自己的存储库中,并以debug作为子模块。
  • filter应该位于自己的存储库中:
    • stderr作为一个子模块
    • stderr作为一个子模块
    • 但是它还应该包含stderr作为直接子模块,或者 它应该使用嵌套子模块中的debug版本吗? (stderr里面的filter和/或里面的rational phasedtest)?
  • phasedtest应位于其自己的存储库中,filter为 子模块(以及任何子子模块组织随附) debug)。

出现的问题

  1. stderrstderr都需要stderr子模块 (但他们不太可能在很大程度上依赖于任何特定的东西 版本libstderr - 几乎任何版本级别的工作版本 10就够了)。因此,他们都需要在子模块中使用libdebug版本。

  2. 有多少个图书馆:应该有吗?选项包括:

    • 是否应该有三个独立的库:libfilterlibfilter, 和stderr
    • 或者libdebug应该包含来自stderr的材料,以及 应该libjlss包含来自stderr的材料(两个 库)?
    • 或者应该有一个单独的复合库debug 其中包含filterphasedteststderr的元素?
    • 如果共享库而不是库,答案是否会有所不同 静态?
  3. 是否应将filter代码组织为第四个库 包含模块debugstderrdebug作为子模块 (这样filter将出现三次,一次为直接 依赖性和两次作为rationalphasedtest)的依赖关系,或 它应该是一个较小的库,需要与三者连接 单独的依赖库?

  4. 由于phasedtest模块只需要phasedtest进行测试, 它不会安装rational库或库。 但它需要它们进行测试。 它是否需要预先安装的stderr库(库), 或者它应该是独立的并且具有必要的代码 测试作为其分发的一部分?

  5. 使用debug的程序也可能使用filter(可能会), 但可能会或可能不会使用phasedtest和{{1}},而且可能会使用{{1}}和{{1}} 不太可能使用{{1}}除了自己的单元测试 组件。

  6. 主要问题

    • Git子模块是正确的方法,还是我应该看一下 另类组织?

    • 假设Git子模块是合适的,Git将如何 存储库组织得最好?

    辅助问题

    • 存储库是否有最小的合理大小?
    • 单个存储库是否存在最大数量的子模块?
    • 单个子模块是否是多个子子模块是否重要? 单个存储库使用的子模块?
    • 子模块是否有传统的目录结构? 所有目录直接位于顶级目录中,或者位于顶级目录中 根目录中的标准目录名,或者是准随机的 超级项目目录层次结构中的位置?
    • 我有没有发现任何明显的陷阱?

2 个答案:

答案 0 :(得分:1)

你的前两个问题(" git子模块是否合适?""我应该如何组织它们?")并不适合stackoverflow:答案主要是意见问题,很难找出任何单一的答案,因为"纠正"。

您的辅助问题稍微可以解决:

  

存储库是否有最小的合理大小?

不是,不。

  

单个存储库是否存在最大数量的子模块?

同样,不,但在创建包含数百个子模块的怪物存储库之前,请确保您熟悉首先。人们对如何最好地管理子模块有不同的看法。花了一些时间思考的Here is one person。我不同意他的所有想法,但这至少是开始思考这个问题的一种方式。

  

单个子模块是否是单个存储库使用的多个子模块的子子模块是否重要?

不是真的,不,虽然如果你的源有多个存储库实例,你可能会遇到版本偏差的问题(例如,一个是版本A而另一个版本是B版,另一个版本是版本C)除非你非常小心。

  

子模块是否有传统的目录结构?所有目录直接位于顶级目录中,或者根目录中的标准目录名中的某些目录,还是超级项目目录层次结构中的准随机位置?

没有,但通常你会选择适合你的东西并坚持下去。我见过很多项目将子模块放入libmodules目录,而其他项目则将它们放在顶层。

  

我有没有发现任何明显的陷阱?

请记住,当作为子模块签出时,当前HEAD由父存储库管理。也就是说,如果您cd进入子模块,进行更改,推送它们,然后在父项目运行git submodule update中,您将回滚子模块的本地副本到记录在其中的任何提交。父节点。

正是出于这个原因,我通常将子模块视为只能通过运行git pull(后跟父存储库中的后续提交)更新的存储库的只读实例。我只编辑存储库的独立签出中的文件。

在将新更改提取到父存储库之后,您需要训练自己定期运行git submodule update(如果这些更改包含子模块的新版本)。

答案 1 :(得分:1)

在我看来,你有3个选项子模块,子树或依赖项(预构建的静态库)。我最近一直在使用子模块,这是一种将git repos放入git repo并跟踪你的根目录所使用的子模块repo的提交方式。如果需要在子模块中进行更改,则应使用子模块,否则请使用子树或依赖项。

要使用依赖项,您需要某种可以打包和解析依赖项的工具 - 依赖项管理器。有一些,但我还没有发现任何人是一般的,而不是嵌套的构建工具。