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

Tob*_*ler 5 git

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

Projects/
+A/
|+.git/
+B/
|+.git
Run Code Online (Sandbox Code Playgroud)

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

  • 首次设置: git clone server:Projects.git
  • Activate project A,它也会克隆它
  • 现在每个git-push/pull,独立于它是否在Projects/Projects/A应该更新两者A.git Projects.git关于 的信息A。任何相关的都B应该被忽略,因为它是不活动的并且本地是空的
  • 激活项目B,也克隆它
  • 现在 any git-push/pullinProjects也应该在Aand 中这样做B,而推/拉A不应该影响B
  • Deactivate project A,它(验证后A.git不需要a git-push)清空本地目录A,不影响Project.git

怎样才能最好地治疗?我目前的方法是一些钩子魔术,但我对git 子模块不够熟悉,看不到这是否可以通过子模块来实现,或者我是否需要使用其他一些解决方案。

Ash*_*vis 7

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

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

您可以使用它一次性克隆元存储库和所有子存储库,这非常棒。

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

cd my-repo
meta git pull
Run Code Online (Sandbox Code Playgroud)

这里有一篇文章帮助开始和使用“元”: https: //medium.com/@patrickleet/mono-repo-or-multi-repo-why-choose-one-when-you-can-have-两者-e9c77bd0c668


Von*_*onC 3

这确实是子模块的用途:
\n跟踪每个子存储库的确切配置(即确切的提交 SHA1)。

\n\n

正如“如何在一行中对所有子模块进行 git clone --recursive 和 checkout master? ”中详细介绍的,您可以在一个命令中克隆父存储库及其所有子模块。

\n\n

正如“子模块的真实本质”中所述,您可以修改它们,前提是您意识到每个模块都处于DETACHED HEAD模式(您需要首先签出本地分支),并且您需要首先提交并推送子模块,在返回父存储库之前,提交并推送到那里(以记录新配置,即新子模块 SHA1)

\n\n

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

\n\n
\n\n

OP Tobias Kienzler 评论

\n\n

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

\n\n

建议看看git-slave

\n\n
\n

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

\n
\n

  • @TobiasKienzler那么你可以看看 git-slave,它更接近你正在寻找的东西:http://gitslave.sourceforge.net/ (2认同)