6

给定项目目录中的 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,克隆它
  • 现在 any git-push/pullin也应该在andProjects中这样做,而 push/pull in不应该影响ABAB
  • 停用项目A,(验证后A.git不需要 a git-push)清空本地目录A,不影响Project.git

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

4

3 回答 3

6

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

你可以在 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-两者-e9c77bd0c668

于 2019-08-08T00:54:08.493 回答
3

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

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

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

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


OP Tobias Kienzler 评论

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

建议看看git-slave

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

于 2012-10-08T10:32:10.573 回答
1

为什么不使用 git 已经提供的东西:

git submodule [--quiet] foreach [--recursive]

git submodule foreach git checkout develop
git submodule foreach git commit
git submodule foreach git push
于 2020-02-28T08:27:29.323 回答