在不同的存储库中拆分一个大项目有多深?

How deep does one split up a big project in different repositories?

我最近将一个 Subversion 存储库迁移到了 Git。一切顺利。我使用了 git 的理念,为软件的每个模块创建单独的存储库。但现在开发人员告诉我,他们经常做的工作会改变主应用程序和其中一个模块中的某些内容,这会进行两次提交,而在一次提交中完成它是有意义的。 这告诉我模块并没有真正独立于主应用程序。所以一个大的存储库是有意义的。 另一方面,我们的主要产品和一些模块也是开源的,我们将这些存储库同步到 Github 和 Sourceforge。但是也有一些闭源模块,真的不应该出去。所以他们必须在我们内部Git实验室的一个单独的仓库中。

他们要我制作两个大的(svn 风格)存储库:一个用于开源,一个用于闭源。另一方面(QA 和发布管理)我觉得这与不同部分如何交互以及如何在一个地方更改任何内容而不必在另一个地方更改其他内容有关。但我不是全职开发人员,也没有深入研究这个特定代码库。

另一个论点:该软件存在 Java 和 C# 风格。 Java 版本之前是在不同的 Jenkins 作业中从 svn 构建的,每个模块一个(因此从 CI 的角度来看,拆分 git 存储库非常有意义),而 C# 版本是建立在一个大的 TeamCity 作业中(借给一个大的 svn 风格的 repo)。

我知道一般的git做法是拆分,但你要拆分多深?

这取决于 "lot" 您有多少个独立模块以及其中有多少经常一起移动。在我们的团队中,我们有 4 个不同的 java 模块(独立移动)、一个 C# 代码库、一个 perl 模块库、数据库工件和一套 shell 脚本。

我们的代码库已经存在了 4-5 年,这导致了大量代码、提交和未使用的分支。尽管 git 速度很快,并且对大型回购进行了大量工程设计,但一段时间后,无论出于何种原因,在 VCS(git/svn/) 中出现如此多的问题都是不健康的。此外,如果我们有独立的存储库,则在开发人员弄乱存储库(这种情况很少发生)时更容易合并和重置,而不会影响其他存储库。

此外,我们在 C# 和 java API 层之间有类似的依赖关系,有时需要在两个存储库中进行提交,但我们计算了单个提交的数量在 API 或 C# 层中,远不止是协调提交,因此进入多个存储库对我们来说很有意义。这也有助于我们所有的模块都没有紧密耦合,并且拥有健全的内部版本控制系统,帮助我们在微服务类型的架构中维护它们。

无论您是否有多个 repos/single 存储库,您都可以设置与技术相关的 build/test/CI 堆栈,因此这不应该成为您想要做什么的决定性因素