具有多个项目的服务器的GIT存储库布局


96

我喜欢设置Subversion的方式之一是,我可以拥有一个包含多个项目的主存储库。当我想从事一个项目时,我可以只签出该项目。像这样

\main
    \ProductA
    \ProductB
    \Shared

然后

svn checkout http://.../main/ProductA

作为git的新用户,我希望在致力于特定工作流程之前探索一下该领域的一些最佳实践。从到目前为止的内容来看,git将所有内容存储在项目树根目录下的单个.git文件夹中。所以我可以做两件事之一。

  1. 为每个产品设置一个单独的项目。
  2. 设置单个大型项目并将产品存储在子文件夹中。

产品之间存在依赖关系,因此单个大型项目似乎很合适。我们将使用所有开发人员都可以共享其代码的服务器。我已经通过SSH和HTTP进行了此工作,我喜欢这一部分。但是,SVN中的存储库已经很多GB了,因此在每台计算机上拖移整个存储库似乎是个坏主意-尤其是因为我们要为过多的网络带宽付费。

我以为Linux内核项目存储库同样大,因此必须有一种使用Git处理此问题的正确方法,但我还没有弄清楚。

是否有用于处理大型多项目存储库的准则或最佳实践?

Answers:


65

关于Git限制,指南很简单:

  • 每个项目一个回购
  • 一个具有子模块的主项目。

这个想法不是将所有内容存储在一个巨型git 仓库中,而是构建一个小型仓库作为主要项目,该项目将引用其他仓库的正确提交,每个仓库代表一个项目或它自己的通用组件。


OP保罗亚历山大 评论

这听起来与Subversion提供的“外部”支持类似。
我们尝试了这一点,发现不断更新外部的版本引用非常麻烦,因为这些项目是在相互依赖的同时进行开发的。还有另一种选择吗?

@Paul:是的,您可以执行以下操作,而不是从主项目中更新版本:

  • 直接从主项目内部开发子项目(如“ 子模块的真实本质 ”中所述),
  • 或在子仓库中引用origin正在其他地方开发的同一个子仓库:您只需要从该子仓库中提取在其他地方进行的更改。

在这两种情况下,您都不必忘记提交主项目,以记录新的配置。没有“外部”属性可在此处更新。所有过程都更加自然。

老实说,这听起来像是一种痛苦,任何需要开发人员每次手动做某事的事情都将成为维护漏洞的常规漏洞。
我想我将研究超级项目中一些脚本的自动化。

我回答:

老实说,您可能是对的……直到最新的Git版本1.7.1为止。
git diff并且git status都学到即使从主项目中执行考虑到子模块的状态。
您根本不能错过子模块的修改。

话虽如此:


另外值得一提的是,如果包括子模块到主项目,每个子模块是它自己的git仓库,所以你可以自由地包括子模块的特定版本,某些标记等
达米安·威尔逊

1
@VonC:听起来类似于Subversion提供的“外部”支持。我们尝试了这一点,发现不断更新外部的版本引用非常麻烦,因为这些项目是在相互依赖的同时进行开发的。还有其他选择吗?
Paul Alexander

@Paul:是的,您可以直接在主项目中开发子项目(请参见stackoverflow.com/questions/1979167/git-submodule-update/…),也可以在主目录中引用而不是从主项目中更新版本。sub-repo是在其他地方开发的相同子仓库的起源:您只需要从该子仓库中提取在其他地方进行的更改。在这两种情况下,您都不必忘记提交主项目,以记录新的配置。没有要更新的“外部”属性。所有过程都更加自然。
VonC

3
@Paul:说实话,您可能是对的……直到最新的Git版本1.7.1。(kernel.org/pub/software/scm/git/docs/RelNotes-1.7.1.txt),git diff并且git status两者都学会了考虑子模块状态,即使从主项目执行也是如此。您根本不能错过子模块的修改。
VonC

1
在@PaulAlexander说点什么之前,我选择相信他现在实际上正在使用子模块。
cregox 2012年

2

GitSlave允许您将多个独立的存储库作为一个进行管理。每个存储库都可以通过常规git命令进行操作,而gitslave允许您在所有存储库上另外运行命令。

super-repo
+- module-a-repo
+- module-b-repo

gits clone url-super-repo
gits commit -a -m "msg"

每个项目的回购在组件化方面具有优势,并使用Maven之类的工具简化了构建。每个项目的仓库通过限制开发人员正在更改的范围(错误地提交垃圾)来增加保护。


您能否介绍一下gitslave与git子模块的优缺点?
MM

1
Gitslave的最大优点是可以让您的Git仓库独立存在。您可以使用普通的git命令管理仓库,而不会影响gitslave关系。但是,例如,当您要在所有存储库中执行标签时,gitslave可以执行该标签。
Andre

1
我认为子模块充满了复杂性。开发人员需要了解它并与其密切合作。
Andre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.