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

如何处理git存储库的元存储库?,git,Git,给定项目目录中的git存储库树,例如 Projects/ +A/ |+.git/ +B/ |+.git 我想建立一个git存储库Projects.git,它不跟踪项目的内容,只跟踪项目的存在和状态。克隆此存储库的人应该只拥有一个未克隆存储库的sekeletona,B等,并单独激活它们,无论它们是否保持同步。典型的工作流如下所示: 第一次安装:git克隆服务器:Projects.git 激活项目A,该项目也会对其进行克隆 现在,每个git推/拉,不管是在Projects/还是Projects/

给定项目目录中的git存储库树,例如

Projects/
+A/
|+.git/
+B/
|+.git
我想建立一个git存储库
Projects.git
,它不跟踪项目的内容,只跟踪项目的存在和状态。克隆此存储库的人应该只拥有一个未克隆存储库的sekeleton
a
B
等,并单独激活它们,无论它们是否保持同步。典型的工作流如下所示:

  • 第一次安装:
    git克隆服务器:Projects.git
  • 激活项目
    A
    ,该项目也会对其进行克隆
  • 现在,每个
    git推/拉
    ,不管是在
    Projects/
    还是
    Projects/A
    中,都应该更新
    A.git
    Projects.git
    关于
    A
    的信息。任何与
    B
    相关的内容都应该被忽略,因为它处于非活动状态且本地为空
  • 激活项目
    B
    ,并克隆该项目
  • 现在
    项目中的任何
    git推/拉
    都应该在
    A
    B
    中进行,而
    A
    中的推/拉不应该影响
    B
  • 停用项目
    A
    ,该项目(在验证
    A.git
    后不需要
    git推送
    )清空本地目录
    A
    ,对
    project.git
如何才能最好地处理这个问题?我目前的方法是一些钩子魔法,但我不太熟悉,不知道是否可以通过子模块实现,或者是否需要使用其他解决方案。

这确实是我的目的:
跟踪每个子回购的精确配置(即精确提交SHA1)

如“”中所述,您可以在一个命令中克隆父repo及其所有子模块

如“”中所述,您可以修改它们,前提是您认识到每一个都处于一种模式(您需要先签出本地分支),并且您需要先提交并推入子模块,然后再返回父repo,提交并推入(以记录新配置,即新子模块SHA1)

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


:

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

我正在看:

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


“元”工具在这方面非常棒

您可以在npm上找到它:

您可以使用它一次克隆一个元回购和所有子回购,这很好

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

cd my-repo
meta git pull
这里有一篇文章提供了入门和使用“meta”的帮助:
为什么不使用git已经提供的功能:

git子模块[--quiet]foreach[--recursive]


这听起来有点像我想要的,但在这种情况下,数据化的头是相当无用的——当我克隆一个子模块时,它应该在它的主头上。基本上,我正在寻找一种方法,使所有项目都有一个本地索引,而不必单独克隆它们,以及一个“同步当前克隆的所有项目”的一体化命令。也许为此使用git存储库实际上是个坏主意?@TobiasKienzler然后你可以看看git slave,它更接近你要找的东西:谢谢,我来看看。这个回答的简单答案是指向许多关于子模块的不同文章;例如,还有很多。许多开发人员发现git子模块令人困惑,在可能的情况下,它们似乎是错误的解决方案。当然,在某些情况下,它们似乎工作正常。为了让这成为一个好答案,我们需要一个清晰的答案,说明它们在哪里工作,以及如何避免陷阱。呜呜!:)谢谢分享
git submodule foreach git checkout develop
git submodule foreach git commit
git submodule foreach git push