多个git存储库克隆到同一目录中

时间:2012-11-25 07:08:00

标签: git multiple-repositories

我的项目有一个标准存储库

/home/repo/.git  

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

/var/www/site1
我还有几个我作为存储库创建的模块,有些网站将使用这些模块,有些则不会。

/home/modules/mod1/.git  
/home/modules/mod2/.git

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

/var/www/site1  

模块目录设置与主仓库具有相同的文件夹结构,当我在主仓库克隆顶部克隆它们时,它们应合并/替换现有文件。 (很少有文件重叠)

我的最佳解决方案是以某种方式命名repo,这样当我部署新网站时,我会做类似的事情:

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子模块和分支,但无法弄清楚它们是否是我需要的。

3 个答案:

答案 0 :(得分: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等具有相同的文件夹结构。然后子模块不太合适,因为子模块必须存在于主仓库的子目录中。在此版本中,您的本地git存储库(由clone创建)知道三个远程存储库。在merge操作之后,其状态将与其中任何一个都不同。 mod1的merge将引入mod1“拥有”的任何新文件。如果home/repo中的任何文件与mod1中的文件同名,则可能会出现合并冲突。您可以向merge提供一个标记,以便从mod1中选择版本总是,我相信你说的是你想要的行为。

答案 1 :(得分:1)

简而言之,你不能让一个git repo成为另一个git repo的目录。

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

这方面的一般方法是有一个主git repo,它没有自己的实际修道院,但只跟踪几个git repos作为其子模块。

或者,我建议使用Android项目开发的repo工具。它涉及创建只包含一个XML文件(称为清单)的小型git存储库,该文件跟踪子项目的签出位置以及它们如何粘合在一起。这在Linux和Mac上运行良好,但遗憾的是不支持Windows(repo需要OS支持符号链接)。

在某种意义上,git子模块和android repo解决了基本相同的任务,但使用的方法略有不同。

答案 2 :(得分:1)

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