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