我的项目有一个标准存储库
/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
还会调用mod1
和mod2
上的提示。
我一直在看git子模块和分支,但无法弄清楚它们是否是我需要的。
答案 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)和mod1
,mod2
等具有相同的文件夹结构。然后子模块不太合适,因为子模块必须存在于主仓库的子目录中。在此版本中,您的本地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。