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

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

于 2012-11-25T07:45:03.723 回答
1

简而言之,您不能将一个 git 存储库作为另一个 git 存储库的子目录。

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

解决此问题的一般方法是拥有一个没有自己的实际修道院的主 git 存储库,但仅跟踪少数 git 存储库作为其子模块。

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

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

于 2012-11-25T07:19:41.483 回答
1

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

于 2013-12-08T19:31:23.673 回答