After successfully converting an SVN repository to Git, I now have a very large Git repository that I want to break down into multiple smaller repositories and maintain history.
So, can someone help with breaking up a repo that might look like this:
MyHugeRepo/
.git/
DIR_A/
DIR_B/
DIR_1/
DIR_2/
Into two repositories that look like this:
MyABRepo/
.git
DIR_A/
DIR_B/
My12Repo/
.git
DIR_1/
DIR_2/
I've tried following directions in this previous question but it doesn't really fit when trying to put multiple directories into a separate repo (Detach (move) subdirectory into separate Git repository).
You could use
git filter-branch --index-filter
withgit rm --cached
to delete the unwanted directories from clones/copies of your original repository.For example:
You will need to manually delete each repository’s unneeded branches or tags (e.g. if you had a feature-x-for-AB branch, then you probably want to delete that from the “12” repository).
This will setup MyABRepo; you can do My12Repo similarly of course.
A reference to .git/refs/original/refs/heads/master remains. You can remove that up with:
If all went well you can then remove MyABRepo.tmp.
If for some reason you get an error regarding .git-rewrite, you can try this:
This will create and use /tmp/git-rewrite.tmp as a temporary directory, instead of
.git-rewrite
. Naturally, you can substitute any path you wish instead of/tmp/git-rewrite.tmp
, so long as you have write permission, and the directory does not already exist.Here is a ruby script that will do it. https://gist.github.com/4341033
The git_split project is a simple script that does exactly what you are looking for. https://github.com/vangorra/git_split
Turn git directories into their very own repositories in their own location. No subtree funny business. This script will take an existing directory in your git repository and turn that directory into an independent repository of its own. Along the way, it will copy over the entire change history for the directory you provided.
Thanks for your answers but I ended up just copying the repository twice then deleting the files I didn't want from each. I am going to use the filter-branch at a later date to strip out all the commits for the deleted files since they are already version controlled elsewhere.
This worked for what I needed.
EDIT: Of course, the same thing was done in the My12Repo against the A and B directory. This gave me two repos with identical history up to the point I deleted the unwanted directories.