在项目目录中给出一个git存储库树,例如
Projects/
+A/
|+.git/
+B/
|+.git
我想设置一个git存储库Projects.git
,它不会跟踪项目的内容,只会跟踪它们的存在和状态。克隆此存储库的人应该只有一个未克隆存储库A
,B
等的骨架,并单独激活它们是否保持同步。典型的工作流程如下所示:
git clone server:Projects.git
A
,也可以克隆它git-push/pull
Projects/
,无论是Projects/A
还是A.git
,都应更新Projects.git
和 A
有关B
的信息。与B
相关的任何内容都应该被忽略,因为它处于非活动状态且本地为空git-push/pull
,同时克隆Projects
中的任何A
也应该同时B
和A
,B
中的推/拉不应影响A
1}} A.git
,该项目(在验证git-push
不需要A
后)清空本地目录Project.git
,而不影响{{1}} 如何最好地对待它?我目前的方法是一些钩子魔术,但我对git submodules不太熟悉,看看是否可以通过子模块实现这一点,或者我是否需要使用其他解决方案。
答案 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:
这听起来像我想要的那样,但在这种情况下,分离的头部是无用的 - 当我克隆一个子模块时,它应该是它的主头。
基本上我正在寻找一种方法来获得所有项目的本地索引,而无需单独克隆它们,以及“同步当前克隆的所有项目”一体化命令。
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