Problem :

we have a git repository located in user@server:/home/witr/git-repos/witr.git witr.git contains 3 projects: proj1, proj2 and proj3 projects are growing up. And cloning witr.git become too slow cause of the size.

Solution : extract each project as a new git repository. Follow steps bellow to extract proj1 (do the same for other projects).

  1. on server : initialize new git repository proj1

    $ cd /home/witr/git-repos $ git init –bare proj1

  2. on local machine : extract proj1 as new git

    $ git clone user@server:/home/witr/git-repos/witr.git $ cd witr $ git branch branch-proj1 $ git filter-branch -f –subdirectory-filter path/to/proj1 branch-proj1 $ cd .. $ mkdir proj1-tmp $ cd proj1-tmp $ git init $ git pull ../witr branch-proj1 $ git remote add proj1 user@server:/home/witr/git-repos/proj1.git $ git push proj1 master

  3. on local machine : ensure that all is right

    $ cd /path/tmp/ $ git clone user@server:/home/witr/git-repos/proj1.git $ cd proj1 $ git log –pretty=format:”%an %ad %s” -10

===================== local machine commands could be automated with following bash script

#!/bin/bash

REMOTE_GIT=user@server:/home/witr/git-repos/$1.git

echo "start extract $REMOTE_GIT"
cd witr

echo "create and filter branch-$1"
git branch branch-$1
git filter-branch -f --subdirectory-filter $1 branch-$1

echo "create new local git repo branch-$1"
cd ..
mkdir branch-$1
cd branch-$1
git init
git pull ../witr branch-$1

echo "push to remote git $REMOTE_GIT"
git remote add $1 $REMOTE_GIT
git push $1 master

echo "done"