多个Git仓库克隆到同一个目录中。

5
我有一个标准的存储库用于我的项目。
/home/repo/.git  

这是我克隆以获取新网站基础代码的存储库,即我将其克隆到。
/var/www/site1

我还创建了几个模块作为代码库,有些网站将使用这些模块,有些则不会。
/home/modules/mod1/.git  
/home/modules/mod2/.git

有没有办法将这些模块克隆到同一个站点文件夹中?
/var/www/site1  

模块目录的文件夹结构与主仓库相同,当我把它们克隆到主仓库克隆之上时,它们应该合并/替换现有文件。(很少有文件重叠)

我的最佳解决方案是以某种方式命名存储库,这样当我部署新网站时,我可以执行以下操作:

cd /var/www/newsite  
git clone /home/repo/.git  
git clone /home/modules/mod1/.git  
git clone /home/moudles/mod2/.git  

当我需要更新网站时,我可以执行如下拉取操作:

git pull origin master  
git pull mod1  
git pull mod2  

或者更好的选择是:
git pull origin master 

我也会调用mod1mod2上的拉取操作。

我一直在研究Git子模块和分支,但我不确定它们是否是我需要的工具。


请使用4个空格标识代码/命令,并进行一些拼写检查。顺便说一下,在英语中,“I”始终大写。 - tiago
3个回答

4
以下是您所需的部署命令略微更改的建议:

这里是对你所需的部署命令的建议轻微更改:

cd /var/www/  
git clone /home/repo/.git newsite
git remote add mod1 /home/modules/mod1/.git  
git remote add mod2 /home/moudles/mod2/.git  

cd newsite
git merge mod1/master
git merge mod2/master

解释:

正如您所说,您的主模块(/home/repo)和您的 mod1mod2 等具有相同的文件夹结构。因此,子模块并不是很合适,因为子模块必须位于您的主存储库的子目录中。在这个版本中,由 clone 创建的本地 git 存储库知道三个远程存储库。在 merge 操作之后,它的状态将与它们中的任何一个都不同。mod1 的合并将带入 mod1 "拥有"的任何新文件。如果 home/repo 中的任何文件与 mod1 中的文件同名,则可能会出现合并冲突等问题。您可以向 merge 提供一个标志,始终选择来自 mod1 的版本,我相信这是您想要的行为。


在添加远程仓库之前,您必须先进入代码库。此外,在合并之前,您必须先进行获取操作 ;) - 但我认为这对于OP不会很有效,因为问题提到了“几乎没有文件重叠”(这告诉我存在重叠)。 - knittl
我认为这对项目来说会非常顺利。当你说我可以“提供一个标志以选择从mod1始终版本进行合并”时,这是否包括除重叠文件之外的所有mod2文件?还是完全排除了mod2的合并? - Jamie

1
简而言之,您不能将一个git仓库作为另一个子目录。
有一个例外:您可以将一个git仓库作为另一个子模块,但这有很多限制和不便之处。
一般的方法是拥有一个主git仓库,它本身没有实际内容,只跟踪几个git仓库作为其子模块。
或者,我建议使用由Android项目开发的repo工具来完成此任务。它涉及创建一个小的git仓库,其中只包含一个XML文件(称为清单),该文件跟踪您的子项目在哪里检出以及它们如何粘合在一起。这在Linux和Mac上非常有效,但不幸的是不支持Windows(repo需要操作系统支持符号链接)。
在某种意义上,git子模块和android repo解决了基本相同的任务,但使用略有不同的方式。

这个规则有一个例外。而且,git-tree是submodule的更好替代品。 - Lazy Badger
git-subtree,抱歉 - http://github.com/apenwarr/git-subtree - Lazy Badger
尽管 git-subtree 很好用,但它仍然无法替代你需要的完全超出你控制范围的外部 git 存储库(不改变提交 ID 并且需要前后合并)。此外,即使在最新的 git 版本中,该功能也没有默认启用。 - mvp

1

vcsh 工具可以在同一个目录中维护多个代码仓库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接