From time to time you may find that you want to make a new repository from a subpath of an existing repository. Perhaps you’re moving some code out into a library or just want to have a common submodule across projects. Thanks to git, it’s easy to do this without losing the history of that subpath in the process.
Splitting a subpath into a repository is a fairly straightforward process, even if the command is hard to remember. For this example, we’ll split
lib/ out of the GitHub gem repository, removing empty commits but retaining the path’s history.
git clone git://github.com/defunkt/github-gem.git # Clone the repository we're going to work with # Initialized empty Git repository in /Users/tekkub/tmp/github-gem/.git/ # remote: Counting objects: 1301, done. # remote: Compressing objects: 100% (769/769), done. # remote: Total 1301 (delta 724), reused 910 (delta 522) # Receiving objects: 100% (1301/1301), 164.39 KiB | 274 KiB/s, done. # Resolving deltas: 100% (724/724), done. cd github-gem/ # Change directory into the repository git filter-branch --prune-empty --subdirectory-filter lib master # Filter the master branch to the lib path and remove empty commits # Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (89/89) # Ref 'refs/heads/master' was rewritten
Now we have a re-written master branch that contains the files that were in
lib/. We can add a remote to the new repository and push, or do whatever we want with the repository.