一个大 Git 回购或多个较小的
One big Git repo or multiple smaller ones
我的 5 名开发人员团队维护着一个中等规模的应用程序,其中包含 6 个解决方案(也称为部分)。目前,我们使用 TFVC 进行源代码控制。每个解决方案都位于自己的主分支中。
我想迁移到 Git。我的问题是是否为所有 6 个解决方案使用 1 Git 回购,或者为每个解决方案使用单独的 Git 回购。
我被一个单一的 Git 存储库所吸引,因为:
- 降低了团队的复杂性。
- 一次提交可以在多个解决方案中进行相关更改(例如将代码从一个解决方案移动到另一个解决方案)。
另一方面,一个 Git 存储库意味着对任何解决方案的更改都会导致我们 TeamCity CI 服务器上所有解决方案的新的完全重建。
就此问题寻求其他团队领导的一些见解。
保持目前的方法,每个解决方案一个回购。如果需要,将 TeamCity 配置为仅根据特定存储库中的更改进行构建。我知道詹金斯可以做到这一点。
我会将每个项目保存在自己的存储库中,让构建服务器单独与它们交互。您仍然可以通过创建一个将每个单独的项目存储库作为子模块包含在内的存储库,为开发人员简化事情并促进跨存储库更改的协调。因此,开发人员检查大回购(通过子模块引用,将获取项目回购),构建服务器只提取项目回购。
即使在使用 git 时,目前允许按项目使用 1 个 repo(大多数答案或建议都会告诉你这样做),确实有解决方案将所有内容都放在同一个存储库,称为 'monorepo' 策略。
像 Google 这样的大型互联网玩家正在这样做(不仅是 git),Facebook 和 Microsoft 正在(几乎)朝着这个方向发展......所以你可以很容易地找到一些关于 pro 的文档和缺点
例如:https://github.com/babel/babel/blob/4c371132ae7321f6d08567eab54a59049e07f246/doc/design/monorepo.md
一旦您了解到主要问题之一是您的版本控制工具的性能(但 git 肯定可以支持 5 个开发团队),这更像是一个项目的感觉...看起来,您已经有了一些优点的想法,强烈建议你去测试一下!
此外,如果您不满意,git命令拆分存储库(保留历史记录)比合并存储库的命令要容易得多,所以它似乎是首先尝试的事情。
在我的团队中,我们越来越倾向于 monorepo。
My team of 5 devs maintains a medium sized application consisting of 6 solutions (aka sections).
如果这是针对一个应用程序,那么 monorepo 确实可能是不错的解决方案。
但是您必须解决的一个问题是,如果您在使用 nuget 管理的解决方案之间存在依赖关系。
要么删除 nuget 的使用,要么使用二进制依赖项(不签入它们!),因此您必须构建所有这些依赖项(但如果要使用分支将很困难)。
要么您接受进行 2 次提交以进行更新(就像您对多个 git 存储库所做的那样)。可以通过构建手动或自动完成。
Ps:git 子模块很困难,不建议第一次使用 git 用户...所以基于此的解决方案将是一个痛苦:-(
On the other hand, one single Git repo means that a change to any solution leads to a new complete rebuild of all solutions on our TeamCity CI server.
不一定,您可以为每个解决方案创建不同的构建,并仅在它们自己的解决方案文件夹上设置 teamcity 触发器。
Ps2:我的回答比预期的要长 ;-) 希望对您有所帮助...
对于开源,如果您想向全世界公开 VCS 访问权限,则每个项目都应该有一个存储库。传统上,开源项目的许多约定在项目生成的每个包中使用一个存储库,但随着围绕打包的既定约定和工具不断改进以更好地支持多租户存储库,这种情况正在发生变化。
对于内部工作,单个存储库(或几个大存储库)要好得多。否则很难做到诸如确保需要交互或共享资源的代码库之间的一致性之类的事情。在现实世界中,在有许多存储库的每种情况下,我发现自己遇到了额外的开销和同步问题,这些问题是由于不必要地跨其他存储库工作而引起的。
有一些注意事项。对于彼此无关的事物,它们可以愉快地在单独的存储库中。 Git mono-repos 也有一定的不足。如果将它与 Monorepo 运行良好的 SVN 进行比较,您就会看到这一点(外部,无需提取整个回购,可以获得特定文件夹等)。您可以解决其中一些问题,例如使用符号链接。
我的 5 名开发人员团队维护着一个中等规模的应用程序,其中包含 6 个解决方案(也称为部分)。目前,我们使用 TFVC 进行源代码控制。每个解决方案都位于自己的主分支中。
我想迁移到 Git。我的问题是是否为所有 6 个解决方案使用 1 Git 回购,或者为每个解决方案使用单独的 Git 回购。
我被一个单一的 Git 存储库所吸引,因为:
- 降低了团队的复杂性。
- 一次提交可以在多个解决方案中进行相关更改(例如将代码从一个解决方案移动到另一个解决方案)。
另一方面,一个 Git 存储库意味着对任何解决方案的更改都会导致我们 TeamCity CI 服务器上所有解决方案的新的完全重建。
就此问题寻求其他团队领导的一些见解。
保持目前的方法,每个解决方案一个回购。如果需要,将 TeamCity 配置为仅根据特定存储库中的更改进行构建。我知道詹金斯可以做到这一点。
我会将每个项目保存在自己的存储库中,让构建服务器单独与它们交互。您仍然可以通过创建一个将每个单独的项目存储库作为子模块包含在内的存储库,为开发人员简化事情并促进跨存储库更改的协调。因此,开发人员检查大回购(通过子模块引用,将获取项目回购),构建服务器只提取项目回购。
即使在使用 git 时,目前允许按项目使用 1 个 repo(大多数答案或建议都会告诉你这样做),确实有解决方案将所有内容都放在同一个存储库,称为 'monorepo' 策略。
像 Google 这样的大型互联网玩家正在这样做(不仅是 git),Facebook 和 Microsoft 正在(几乎)朝着这个方向发展......所以你可以很容易地找到一些关于 pro 的文档和缺点
例如:https://github.com/babel/babel/blob/4c371132ae7321f6d08567eab54a59049e07f246/doc/design/monorepo.md
一旦您了解到主要问题之一是您的版本控制工具的性能(但 git 肯定可以支持 5 个开发团队),这更像是一个项目的感觉...看起来,您已经有了一些优点的想法,强烈建议你去测试一下!
此外,如果您不满意,git命令拆分存储库(保留历史记录)比合并存储库的命令要容易得多,所以它似乎是首先尝试的事情。
在我的团队中,我们越来越倾向于 monorepo。
My team of 5 devs maintains a medium sized application consisting of 6 solutions (aka sections).
如果这是针对一个应用程序,那么 monorepo 确实可能是不错的解决方案。
但是您必须解决的一个问题是,如果您在使用 nuget 管理的解决方案之间存在依赖关系。
要么删除 nuget 的使用,要么使用二进制依赖项(不签入它们!),因此您必须构建所有这些依赖项(但如果要使用分支将很困难)。
要么您接受进行 2 次提交以进行更新(就像您对多个 git 存储库所做的那样)。可以通过构建手动或自动完成。
Ps:git 子模块很困难,不建议第一次使用 git 用户...所以基于此的解决方案将是一个痛苦:-(
On the other hand, one single Git repo means that a change to any solution leads to a new complete rebuild of all solutions on our TeamCity CI server.
不一定,您可以为每个解决方案创建不同的构建,并仅在它们自己的解决方案文件夹上设置 teamcity 触发器。
Ps2:我的回答比预期的要长 ;-) 希望对您有所帮助...
对于开源,如果您想向全世界公开 VCS 访问权限,则每个项目都应该有一个存储库。传统上,开源项目的许多约定在项目生成的每个包中使用一个存储库,但随着围绕打包的既定约定和工具不断改进以更好地支持多租户存储库,这种情况正在发生变化。
对于内部工作,单个存储库(或几个大存储库)要好得多。否则很难做到诸如确保需要交互或共享资源的代码库之间的一致性之类的事情。在现实世界中,在有许多存储库的每种情况下,我发现自己遇到了额外的开销和同步问题,这些问题是由于不必要地跨其他存储库工作而引起的。
有一些注意事项。对于彼此无关的事物,它们可以愉快地在单独的存储库中。 Git mono-repos 也有一定的不足。如果将它与 Monorepo 运行良好的 SVN 进行比较,您就会看到这一点(外部,无需提取整个回购,可以获得特定文件夹等)。您可以解决其中一些问题,例如使用符号链接。