多个git仓库克隆到同一目录

multiple git repositories cloned into the same directory

本问题已经有最佳答案,请猛点这里访问。

我已经为我的项目建立了一个标准存储库

1
/home/repo/.git

这是我克隆的存储库,用于获取新网站的基本代码
即我将其克隆到

1
/var/www/site1

我还有一些我作为存储库创建的模块,有些网站将使用这些模块,有些则不会。

1
2
/home/modules/mod1/.git  
/home/modules/mod2/.git

有没有一种方法可以将这些模块克隆到同一站点文件夹中?

1
/var/www/site1

模块目录设置为与主仓库相同的文件夹结构,当我将其克隆到主仓库克隆之上时,它们应合并/替换现有文件。 (几乎没有文件重叠)

我的最佳解决方案是以某种方式命名存储库,以便在部署新站点时执行以下操作:

1
2
3
4
cd /var/www/newsite  
git clone /home/repo/.git  
git clone /home/modules/mod1/.git  
git clone /home/moudles/mod2/.git

,当我要对该网站进行更新时,可以执行以下操作:

1
2
3
git pull origin master  
git pull mod1  
git pull mod2

或优选:

1
git pull origin master

还将调用mod1mod2上的拉动。

我一直在查看git子模块和分支,但无法确定它们是否是我所需要的。


建议您对所需的部署命令进行一些细微更改:

1
2
3
4
5
6
7
8
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等具有相同的文件夹结构。那么,子模块就不太合适了,因为子模块必须位于主仓库的子目录中。在此版本中,您的本地git存储库(由clone创建)知道三个远程存储库。在merge操作之后,其状态将与它们中的任何一个都不相同。 mod1的merge将引入mod1"拥有"的所有新文件。如果home/repo中的任何文件与mod1中的文件具有相同的名称,则可能会发生合并冲突。您可以向merge提供标志以始终从mod1中选择版本,我相信您说的是您想要的行为。


vcsh工具允许在同一目录中维护多个存储库。


简而言之,您不能让一个git repo成为另一个git的sudirectory。

此规则有一个例外:您可以将一个git repo作为另一个模块的子模块,但这有很多限制和不便。

通常的方法是拥有一个主git repo,它本身没有实际的修道院,但是仅跟踪几个git repos作为其子模块。

或者,我建议为此目的使用由Android项目开发的repo工具。它涉及到创建仅包含一个XML文件(称为清单)的小型git存储库,该文件跟踪子项目的检入位置以及如何将子项目粘合在一起。这在Linux和Mac上确实能很好地工作,但是不幸的是,它不支持Windows(回购要求操作系统提供符号链接支持)。

从某种意义上说,git子模块和android repo解决了本质上相同的任务,但是使用的方式略有不同。