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

时间:2010-04-28 18:05:28

标签: git

我喜欢Subversion设置的方式之一就是我可以拥有一个包含多个项目的主存储库。当我想在一个项目上工作时,我可以查看该项目。喜欢这个

\main
    \ProductA
    \ProductB
    \Shared

然后

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

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

  1. 为每个产品设置单独的项目。
  2. 设置单个大型项目并将产品存储在子文件夹中。
  3. 产品之间存在依赖关系,因此单个大型项目似乎是合适的。我们将使用一个服务器,所有开发人员都可以共享他们的代码。我已经通过SSH& HTTP和我喜欢的那部分。但是,SVN中的存储库的大小已经很多GB,因此在每台计算机上拖动整个存储库似乎都是一个坏主意 - 特别是因为我们需要承担过多的网络带宽。

    我认为Linux内核项目存储库同样大,所以必须有一个正确的方法来处理这个Git,但我还没想到它。

    是否有使用超大型多项目存储库的指南或最佳实践?

2 个答案:

答案 0 :(得分:65)

关于 Git limits

,指南很简单
  • 每个项目一个回购
  • submodules 的主要项目。

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


OP Paul Alexander comments

  

这听起来类似于颠覆所提供的“外部”支持   我们尝试了这一点,并发现不断更新外部版本引用非常麻烦,因为项目是相互依赖开发的。还有其他选择吗?

@Paul:是的,不是从主项目更新版本,而是:

  • 直接从主项目中开发子项目(如“True Nature of submodules”中所述),
  • 或者您在子回购中引用了origin朝向在别处开发的同一个子仓库:从那里您只需要从该子仓库中提取其他地方所做的更改。

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

  

老实说,这听起来像是一个真正的痛苦,任何需要开发人员每次手动执行某些操作的事情只会成为维护的常规错误来源。
  我想我会考虑使用超级项目中的一些脚本来自动执行此操作。

我回答说:

老实说,你可能是对的......直到最近Git release 1.7.1 git diffgit status都学会了考虑子模块状态,即使是从主项目执行也是如此。
你根本不能错过子模块修改。

话虽如此:

答案 1 :(得分:2)

GitSlave允许您管理多个独立的回购。每个仓库都可以通过常规git命令进行操作,而gitslave允许您在所有仓库中另外运行命令。

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

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

Repo-per-project在使用Maven等工具进行组件化和简化构建方面具有优势。 Repo-per-project通过限制开发人员正在改变的范围来增加保护 - 就错误的垃圾提交而言。