Not required but I like to start with a fresh clone of the repo I'm working with into a temp directory.
mkdir tmp
cd tmp
git clone my_original_repo_url
Now clone the repo again (this time it's a local only clone of the repo above):
git clone --no-hardlinks my_original_repo new_repo_name
cd new_repo_name
Extract just the subdirectory you want:
git filter-branch --subdirectory-filter mysubdir
Now lets remove the old remotes, any unneeded history and repack the repo:
git remote rm origin
git update-ref -d refs/original/refs/heads/master
git reflog expire --expire=now --all
git repack -ad
Now you can add your new remote(s) in and push your changes up to the server:
git remote add origin my_new_repo_url
git push origin master
Note: If you are using Gitorious it may at this point complain about a 'invalid ref' when you push it to the server. As far as I can tell this does not cause any problems and only occurs on the first push.
So that covers making your new repo from a subdirectory now lets go remove the now old subdirectory from the original repo so we don't commit to it by accident. I'm using a simplified removal process, you could remove all references and commit info for the subdirectory if you like but for my case that was overkill.
cd ../my_original_repo
rm -rf mysubdir
git rm -r mysubdir
git commit -m "Removing subdir, it has been moved to its own repo now"
git push origin master
All done!
Your subdirectory has now been moved from the original repository into a new repository with all your history and commits intact.
No comments:
Post a Comment