2012-11-25 241 views
4

我有一个标准库为我的项目多个Git仓库

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

+0

请用4个空格标识代码/命令并进行一些拼写检查。顺便说一句,用英语,'我'总是大写。 – tiago

回答

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 

说明:

正如你所说,你的主要模块(/家/回购)和您mod1mod2等有同一文件夹结构。因此子模块不适合使用,因为子模块必须位于主回购库的子目录中。在这个版本中,你的本地git仓库(由clone创建)知道三个远程仓库。在merge操作之后,其状态将不会与它们中的任何一个相同。 mod1的merge将引入由mod1“拥有”的任何新文件。如果home/repo中的任何文件与mod1等中的文件具有相同的名称,您可能会遇到合并冲突。您可以提供一个标志,以mergemod1始终选择版本,我相信您说的是您想要的行为。

+0

在添加遥控器之前,您必须先进入存储库。另外,你必须首先获取,然后才能合并;) - 但我认为这对于OP来说不会有效,因为问题提到“很少有任何文件重叠”(它告诉我,有重叠)。 – knittl

+0

我认为这对项目会很好。当你说我可以“提供一个标志来合并从mod1始终选择版本”,那么除了重叠文件外,是否会包含mod2中的所有文件?或者完全消除合并中的mod2? – Jamie

1

总之,你不能有一个git仓库作为另一个仓库的sudirectory。

这个规则有一个例外:你可以有一个git仓库作为另一个仓库的submodule,但是这有很多限制和不便。

一般的做法是有一个主git回购,它没有自己的实际修改,但只跟踪少数git回购作为其子模块。

或者,我会建议使用由Android项目开发的repo工具来完成此目的。它涉及创建一个只包含一个XML文件(称为manifest)的小型git存储库,该文件可以跟踪您的子项目检出的位置以及它们如何粘在一起。这在Linux和Mac上运行得非常好,但不幸的是不支持Windows(repo需要OS支持符号链接)。

从某种意义上说,git子模块和android回购解决基本相同的任务,但使用略有不同的手段。

+0

“这条规则有一个例外” - ** 2 **。和git树是一个很好的替代子模块 –

+0

git子树,对不起 - http://github.com/apenwarr/git-subtree –

+0

和git-subtree一样好,它仍然不能取代外部git回购你需要和完全不在你的控制范围之内(不需要改变提交ID和来回合并的必要性)。另外,即使在最新的git中,它也没有默认启用 – mvp

1

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