multiple git repositories cloned into the same directory

Jamie picture Jamie · Nov 25, 2012 · Viewed 12k times · Source

I've got a standard repository for my project

/home/repo/.git  

this is the repository i clone to get the base code for new websites i.e. i cloned this to

/var/www/site1

i also have several modules that i've created as repositories, some websites will be using these modules and some will not.

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

is there a way that i can clone those modules into the same site folder?

/var/www/site1  

the module directories are set up with the same folder structure as the master repo, when i clone them on top of the master repo clone they should merge/replace existing files. (rarely any file overlap)

my optimal solution would be naming the repo's in some way so that when i deploy a new site I do something like:

cd /var/www/newsite  
git clone /home/repo/.git  
git clone /home/modules/mod1/.git  
git clone /home/moudles/mod2/.git  

and when I have updates to make to the site I could do a pull like:

git pull origin master  
git pull mod1  
git pull mod2  

or preferably:

git pull origin master 

would also call the pulls on mod1 and mod2.

I've been looking at git submodules and branches but can't figure out if they are what I need.

Answer

gcbenison picture gcbenison · Nov 25, 2012

Here's a suggested slight change to your desired deploy commands:

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

Explanation:

As you said, your main module (/home/repo) and your mod1, mod2 etc. have the same folder structure. Submodules then aren't really appropriate since a submodule has to live in a subdirectory of your main repo. In this version, your local git repository (created by the clone) knows about three remote repositories. After the merge operations, its state won't be the same as any of them. The merge of mod1 will bring in any new files "owned" by mod1. You may get merge conflicts if any files in home/repo have the same name as those in mod1, etc. You could supply a flag to merge to select the version from mod1 always, which I believe you said is the behavior you want.