Once upon a time all my Android apps and VMSoft related stuff were part of one big BitBucket git repository along with an issue tracker. This was a good idea when being an Android dev was just a hobby for the weekends and not my primary job.
Enough rambling 🙂 , this blog post is about moving files from one git repository to another and preserving your history.
Our goal is to move a single directory from one big Git repository to it’s own repository, we would like to preserve the commits history for that specific directory also.
In this example our big repo will be called A and our new repo that will host it’s own subset of files will be called B
First filter the files from the big repo (A) by leaving only the ones you need:
git clone < repo A url >
cd < repo A directory > |
git clone < repo A url >
cd < repo A directory >
Remove the “origin”
and filter A by < directory_to_move >. This action will go trough all the history and files and remove anything that’s not in < directory_to_move >.
More info on the inner workings of git filter-branch here.
git filter-branch --subdirectory-filter <directory_to_move> -- --all |
git filter-branch --subdirectory-filter <directory_to_move> -- --all
filter-branch will leave you with the contents of < directory_to_move > in the root of repository A. Commit the changes and we can continue with the next step.
Moving to the new repository
Link repo A with repo B. The command below will make repository A branch of repository B.
git remote add repo-A-branch <git repository A directory> |
git remote add repo-A-branch <git repository A directory>
Pull from the branch allowing unrelated histories
git pull repo-A-branch master --allow-unrelated-histories |
git pull repo-A-branch master --allow-unrelated-histories
and finally remove repo-A-branch
git remote rm repo-A-branch |
git remote rm repo-A-branch
That’s it, you now have your files in a new repository while preserving commits history.