我的项目有一个标准存储库
/home/repo/.git
这是我克隆的存储库,用于获取新网站的基本代码即,我将其克隆到
/var/www/site1
我还创建了几个模块作为存储库,有些网站会使用这些模块,有些则不会。
/home/modules/mod1/.git
/home/modules/mod2/.git
有没有一种方法可以将这些模块克隆到同一个站点文件夹中?
/var/www/site1
模块目录使用与主repo相同的文件夹结构进行设置,当我在主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
也将调用CCD_ 1和CCD_。
我一直在研究git子模块和分支,但不知道它们是否是我所需要的。
以下是对您想要的部署命令的一个建议的轻微更改:
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)和mod1
、mod2
等具有相同的文件夹结构。子模块实际上并不合适,因为子模块必须位于主repo的子目录中。在这个版本中,您的本地git存储库(由clone
创建)知道三个远程存储库。在merge
操作之后,它的状态将与它们中的任何一个都不一样。mod1的merge
将引入mod1"拥有"的任何新文件。如果home/repo
中的任何文件与mod1
中的文件同名,则可能会出现合并冲突。等等。您可以向mod1
0提供一个标志,以始终从mod1
中选择版本,我相信您说过这是您想要的行为。
简而言之,不能将一个git repo作为另一个的sudirectory。
这个规则有一个例外:您可以将一个git repo作为另一个的子模块,但这有很多限制和不便。
一般的方法是有一个主git-reo,它没有自己的实际约定,但只跟踪几个git-reo作为其子模块。
或者,我建议使用Android项目开发的repo
工具来达到这个目的。它包括创建一个小的git存储库,其中只包含一个XML文件(称为manifest),该文件跟踪子项目签出到哪里以及它们是如何粘合在一起的。这在Linux和Mac上运行得很好,但不幸的是,它不支持Windows(repo需要操作系统的符号链接支持)。
在某种意义上,git子模块和android repo解决的任务本质上相同,但使用的方法略有不同。