我想知道Git子模块是否合适 组织我目前保留在RCS下的一些代码,如果 那么,子模块应该如何组织。
假设我有一个库模块的集合(也许是库 单库的一部分;这是一个讨论的项目)。 假设其中一些模块是基础模块,其他模块依赖 在基础模块上。 所有这些模块都打算用于其他包装 软件(程序),可能包括适当的 选择这些包作为子模块。
为了使其具体,库模块是:
stderr
- 标准化错误报告例程(不依赖于
其他模块)。filter
- 文件过滤器程序(如grep
或cat
):使用
stderr
。debug
- 调试跟踪支持:使用stderr
phasedtest
- 单元代码测试:使用filter
,debug
和
直接stderr
。rational
- 使用的有理数运算包
phasedtest
代表其测试代码,但独立于phasedtest
否则就会产生依赖性。许多其他程序使用stderr
。
相当多的使用也使用filter
(以及所有使用的代码)
filter
也直接使用stderr
,但有很多
使用stderr
但不使用filter
的程序。
有些程序使用debug
;基本上所有这些程序也使用
直接stderr
,但他们可能会也可能不会直接使用filter
。
使用phasedtest
的单元测试程序可能会也可能不会使用stderr
,
直接filter
和debug
(他们更有可能使用stderr
而不是phasedtest
其他人),但rational
本身需要它们,所以这些程序总是如此
间接使用这些模块。
有些程序可能会使用stderr
;通常他们也会使用stderr
(我写的几乎所有内容都使用phasedtest
),但这些程序并不适用
一般来说,直接使用$HOME/lib
。
只是为了澄清:目前,这些潜在的Git模块和
子模块根本不在Git中;他们中的大多数都有广泛的(10-30
年份)RCS的历史(在Y2K之前的SCCS),将在以后保留
他们过渡到Git。
目的是在适当的时候将所有的回购都放到GitHub中。
通常,这些模块都相当稳定。
它们确实得到修订或扩展,但不一定每年都有。
有时,三年或更长时间没有改变其中一些。
我有一个构建/分发系统,其中的文件构成了什么
可能会成为子模块被拉入更大的分布
计划何时准备发布。
在正常(单人)发展期间,材料生活在一个
包含数百个源文件的库(单个(静态))
库(在$HOME/inc
中)和单个头目录(/usr/include
,
类似于/usr/local/include
或完全分开stderr
或
filter
)。
我正在寻求获得结构"对" - 对我来说足够正确 在将它们转换为Git之前,我不会后悔我所做的事情。 我仍然需要解决版本标记和标记问题;这是一个 整个单独的包包“蠕虫”,而不是这个问题的一部分。
根据我对子模块的理解,它似乎是:
stderr
应该在自己的存储库中。debug
应位于自己的存储库中,并以stderr
作为子模块。phasedtest
应位于自己的存储库中,并以debug
作为子模块。filter
应该位于自己的存储库中:
stderr
作为一个子模块stderr
作为一个子模块stderr
作为直接子模块,或者
它应该使用嵌套子模块中的debug
版本吗?
(stderr
里面的filter
和/或里面的rational
phasedtest
)?phasedtest
应位于其自己的存储库中,filter
为
子模块(以及任何子子模块组织随附)
debug
)。 stderr
和stderr
都需要stderr
子模块
(但他们不太可能在很大程度上依赖于任何特定的东西
版本libstderr
- 几乎任何版本级别的工作版本
10就够了)。因此,他们都需要在子模块中使用libdebug
版本。
有多少个图书馆:应该有吗?选项包括:
libfilter
,libfilter
,
和stderr
?libdebug
应该包含来自stderr
的材料,以及
应该libjlss
包含来自stderr
的材料(两个
库)?debug
其中包含filter
,phasedtest
和stderr
的元素?是否应将filter
代码组织为第四个库
包含模块debug
,stderr
和debug
作为子模块
(这样filter
将出现三次,一次为直接
依赖性和两次作为rational
和phasedtest
)的依赖关系,或
它应该是一个较小的库,需要与三者连接
单独的依赖库?
由于phasedtest
模块只需要phasedtest
进行测试,
它不会安装rational
库或库。
但它需要它们进行测试。
它是否需要预先安装的stderr
库(库),
或者它应该是独立的并且具有必要的代码
测试作为其分发的一部分?
使用debug
的程序也可能使用filter
(可能会),
但可能会或可能不会使用phasedtest
和{{1}},而且可能会使用{{1}}和{{1}}
不太可能使用{{1}}除了自己的单元测试
组件。
Git子模块是正确的方法,还是我应该看一下 另类组织?
假设Git子模块是合适的,Git将如何 存储库组织得最好?
答案 0 :(得分:1)
你的前两个问题(" git子模块是否合适?""我应该如何组织它们?")并不适合stackoverflow:答案主要是意见问题,很难找出任何单一的答案,因为"纠正"。
您的辅助问题稍微可以解决:
存储库是否有最小的合理大小?
不是,不。
单个存储库是否存在最大数量的子模块?
同样,不,但在创建包含数百个子模块的怪物存储库之前,请确保您熟悉首先。人们对如何最好地管理子模块有不同的看法。花了一些时间思考的Here is one person。我不同意他的所有想法,但这至少是开始思考这个问题的一种方式。
单个子模块是否是单个存储库使用的多个子模块的子子模块是否重要?
不是真的,不,虽然如果你的源有多个存储库实例,你可能会遇到版本偏差的问题(例如,一个是版本A而另一个版本是B版,另一个版本是版本C)除非你非常小心。
子模块是否有传统的目录结构?所有目录直接位于顶级目录中,或者根目录中的标准目录名中的某些目录,还是超级项目目录层次结构中的准随机位置?
没有,但通常你会选择适合你的东西并坚持下去。我见过很多项目将子模块放入lib
或modules
目录,而其他项目则将它们放在顶层。
我有没有发现任何明显的陷阱?
请记住,当作为子模块签出时,当前HEAD由父存储库管理。也就是说,如果您cd
进入子模块,进行更改,推送它们,然后在父项目运行git submodule update
中,您将回滚子模块的本地副本到记录在其中的任何提交。父节点。
正是出于这个原因,我通常将子模块视为只能通过运行git pull
(后跟父存储库中的后续提交)更新的存储库的只读实例。我只编辑存储库的独立签出中的文件。
在将新更改提取到父存储库之后,您需要训练自己定期运行git submodule update
(如果这些更改包含子模块的新版本)。
答案 1 :(得分:1)
在我看来,你有3个选项子模块,子树或依赖项(预构建的静态库)。我最近一直在使用子模块,这是一种将git repos放入git repo并跟踪你的根目录所使用的子模块repo的提交方式。如果需要在子模块中进行更改,则应使用子模块,否则请使用子树或依赖项。
要使用依赖项,您需要某种可以打包和解析依赖项的工具 - 依赖项管理器。有一些,但我还没有发现任何人是一般的,而不是嵌套的构建工具。