如何处理git存储库的元库?

时间:2012-10-08 09:48:48

标签: git

在项目目录中给出一个git存储库树,例如

Projects/
+A/
|+.git/
+B/
|+.git

我想设置一个git存储库Projects.git,它不会跟踪项目的内容,只会跟踪它们的存在和状态。克隆此存储库的人应该只有一个未克隆存储库AB等的骨架,并单独激活它们是否保持同步。典型的工作流程如下所示:

  • 首次设置:git clone server:Projects.git
  • 激活项目A,也可以克隆它
  • 现在每git-push/pull Projects/,无论是Projects/A还是A.git,都应更新Projects.git A有关B的信息。与B相关的任何内容都应该被忽略,因为它处于非活动状态且本地为空
  • 激活项目git-push/pull,同时克隆
  • 现在,Projects中的任何A也应该同时BAB中的推/拉不应影响A 1}}
  • 停用项目A.git,该项目(在验证git-push不需要A后)清空本地目录Project.git,而不影响{{1}}

如何最好地对待它?我目前的方法是一些钩子魔术,但我对git submodules不太熟悉,看看是否可以通过子模块实现这一点,或者我是否需要使用其他解决方案。

3 个答案:

答案 0 :(得分:3)

这确实是submodules的用途:
跟踪每个子目录的确切配置(即确切的提交SHA1)。

如“How do I git clone --recursive and checkout master on all submodules in a single line?”中所述,您可以在一个命令中克隆父repo及其所有子模块。

如“True nature of submodules”中所述,您可以修改它们,只要您意识到每个都处于DETACHED HEAD模式(您需要先签出本地分支),并且您需要提交然后先推入子模块,然后返回到父repo,提交并推送(记录新配置,即新的子模块SHA1)

您可以删除子模块目录,而不会损坏对该子模块的父repo引用。


The OP Tobias Kienzler comments

这听起来像我想要的那样,但在这种情况下,分离的头部是无用的 - 当我克隆一个子模块时,它应该是它的主头。
基本上我正在寻找一种方法来获得所有项目的本地索引,而无需单独克隆它们,以及“同步当前克隆的所有项目”一体化命令。

suggests查看git-slave

  

Gitslave创建了一组相关的存储库 - 一个超级项目存储库和一些从属存储库 - 所有这些存储库都是在所有git操作正常运行的基础上同时开发的;   因此,当您分支时,项目中的每个存储库依次分支   同样,当你提交,推,拉,合并,标记,结账,状态,日志等;每个git命令将依次在超级项目和所有从属存储库上运行。

答案 1 :(得分:2)

“元”工具对此非常有用。

您可以在npm上找到它:https://www.npmjs.com/package/meta

您可以使用它一次克隆一个元仓库和所有子仓库,这很棒。

然后,您可以使用它将操作应用于所有子存储库,例如提取元存储库和所有子存储库:

cd my-repo
meta git pull

这里有一篇文章可以帮助您入门和使用“元”: https://medium.com/@patrickleet/mono-repo-or-multi-repo-why-choose-one-when-you-can-have-both-e9c77bd0c668

答案 2 :(得分:0)

为什么不使用git已经提供的内容:

git子模块[--quiet] foreach [-递归]

git submodule foreach git checkout develop
git submodule foreach git commit
git submodule foreach git push