Merging Repositories

Project to merge repositories launched in 2015

This page is a work in progress

How to move from multi-modules installs to the coral-erm main repository

The goal is to migrate from Coral with several modules as you know from ndlibersa to a single repository. This procedure is a way to do it. Setup a Coral “nearby” your current coral setup and switch from one to the other.


Be sure to be up to date for all Coral modules

For the example I used two locations:

CORAL_MULTI_MODULES=/home/coral/www # current setup CORAL_MAIN_REPO=/home/coral/main # setup for testing and future source code

Checkout new sources

cd $CORAL_MULTI_MODULES cd .. git clone git://

Create another site for web server

Clone your current config file and change the source directory

Example with nginx:

cp /etc/nginx/sites-enabled/coral-httpd.conf /etc/nginx/sites-enabled/coral-main-httpd.conf vim /etc/nginx/sites-enabled/coral-main-httpd.conf

Replace CORAL_MULTI_MODULES by CORAL_MAIN_REPO directory in coral-main-httpd.conf and server_name

service nginx stop service nginx start

Copy your current config files in main repository

cd $CORAL_MAIN_REPO cp $CORAL_MULTI_MODULES/auth/admin/configuration.ini $CORAL_MAIN_REPO/auth/admin/configuration.ini cp $CORAL_MULTI_MODULES/resources/admin/configuration.ini $CORAL_MAIN_REPO/resources/admin/configuration.ini cp $CORAL_MULTI_MODULES/organizations/admin/configuration.ini $CORAL_MAIN_REPO/organizations/admin/configuration.ini

[…] Do it for all your modules.

Test your new site pointing on CORAL_MAIN_REPO

Check everything is alright with the new main repository and your databases. Switch sites to have the main repo in the good location


Enjoy, the new main repository is now in production. How has been created this main repository

The idea was to move all module codes/patches into a subdirectory with the target name, then merge the result in a single git repository. Example :

the organization repository has files in . (index.php, templates/, admin.php …) after the following commands, everything is move in a organizations directory What must be understood is that git clone organizations… create an organizations directory. But it’s the “root” directory of the repository. What we want is to have everything in an “organizations directory” that is a subdir of this one. So at the end of the process, the code is in organizations/organizations/*, and that’s what we want, because the 1st “organizations” is the repo name. The magic command is :

git filter-branch –prune-empty –tree-filter ‘mkdir -p organizations && git ls-tree –name-only $GIT_COMMIT | xargs -I files mv files organizations’

It create an organizations directory and move all files created/updated by a patch into this directory.

Complete script:

clone main

cd ~/coralmerged git clone

clone organizations

git clone

enter organizations and move everything into organizations/organizations

cd organizations git filter-branch –prune-empty –tree-filter ‘mkdir -p organizations && git ls-tree –name-only $GIT_COMMIT | xargs -I files mv files organizations’

now, go back to CORAL-Main and merge the organizations patches

cd ../CORAL-Main git remote add organizations ~/coralmerged/organizations/ git remote update organizations git merge origin/organizations

that’s all folks.

do that for every module

Hey, for resources and reports, I get a nasty message “blabla is not empty”.

Yes. That’s because for resources & reports, there is already a resources & reports subdirectory (that is quickly dropped for reports, but it exist at one time). So moving into the resources/reports directory is not possible, as it already exist.

We need to trick git by moving into a temporary directory, then rename it. Thus we have:

resources/cataloguing.php then
newresources/resources/cataloguing.php then
We do this in 4 steps:

move everythin in a newresource directory

git filter-branch –prune-empty –tree-filter ‘mkdir -p newresources && git ls-tree –name-only $GIT_COMMIT | xargs -I files mv files newresources’

rename the newresources directory into resources

git filter-branch –prune-empty –tree-filter ‘mkdir -p resources && mv newresources/* resources/’

move .htaccess

git filter-branch -f –prune-empty –tree-filter ‘mkdir -p resources && mv newresources/.htaccess resources/’

move .gitignore

git filter-branch -f –prune-empty –tree-filter ‘mkdir -p resources; if [ -e “newresources/.gitignore” ]; then mv newresources/.gitignore resources/; fi’

(The .htaccess & .gitignore steps are mandatory because the * does not include .* files)

Once this is made for all ndlibersa modules, add coral-main repository, and push the merged repository

git remote add coral-erm git remote update coral-erm git push -f coral-erm master

Compare two directories (merged repo & non-merged instance with multiple repos to verify everything is OK

To verify directories tree before / after, you can use

diff <(cd directory_before && find | sort) <(cd directory_after && find | sort) > output.log