Git Submodule from Existing Path with Branches
This article will show you how you can migrate an existing path within an existing project into a new project, then add that new project as submodule to the original project, while keeping all tags and branches. Typically, branches are lost in migration, but not with this little addition.
Fill a New Repository With a Complete Sub Path of Another Repository
You clone the original project, then filter to the path you want to extract, change the origin and push everything to the new origin. But with only that, this will not copy all the existing branches. Only if you first checkout all branches, then they will also be pushed to the new location. This is what the for-loop does for you.
git clone git@server.url:path/to/original-project.git cd original-project git filter-branch --tag-name-filter cat --subdirectory-filter path/to/submodule -- --all for b in $(git branch -r); do git checkout ${b#origin/} git reset --hard $b git fetch git reset --hard ${b#origin/} done git remote remove origin git remote add origin git@server.url:path/to/new-sub-project.git git push origin --all
Now you have a new repository that contains only a part of the previous one.
Replace a Path with a Submodule
Next step is to replace the path in the old repository by the new repository as a submodule. Clone the original project again (delete the previous clone).
git clone git@server.url:path/to/original-project.git cd original-project git rm -rf path/to/submodule git commit -am "remove old path/to/submodule" git submodule add git@server.url:path/to/new-sub-project.git path/to/submodule
Now you have replaced path/to/submodule by a new submodule.