Table of Contents
Context
In the real world, we may probably have a large Git repository where you want to move out some sub-directories into single Git repositories. Regarding the Git repository, we likely want to preserve old commits or commits relevant to those directories during the movement. Of course, we cannot move them using the standard way of moving files/directories as usual because the Git histories won’t be moved along with the files. Fortunately, Git supports us to do it by implementing subtree split
command.
We will exercise with one of our GitHub repositories: https://github.com/ITersDesktop/devops although it is not a big repository. To ease your reading, we are supposed to move the K8s
directory out of the repository.
Steps
Thanks for the answer, we demonstrate the step-by-step procedure to move the K8s
directory from the GitHub repository above and create a new one.
Step 01: Create a new branch in the old/big repository
~/tmp > cd devops ~/tmp/devops > git subtree split -P K8s -b k8s Created branch 'k8s' 03d9101f8b5647da94c4b4387660746cfb45bca4
Note: <name-of-folder>
must NOT contain leading or trailing characters. For instance, the folder named subproject
MUST be passed as subproject
, NOT ./subproject/
Note: <name-of-new-branch>
is a branch you will be creating in the existing/old repo, NOT the new one [that comes later].
Note for Windows users: When your folder depth is > 1, <name-of-folder>
you must have *nix style folder separator (/). For instance, the folder named path1\path2\subproject
MUST be passed as path1/path2/subproject
Step 02: Create a new repository and pull all commits
~/tmp/devops > cd ../ ~/tmp > mkdir k8s ~/tmp > cd k8s ~/tmp/k8s > git init Initialized empty Git repository in /Users/tnguyen/tmp/k8s/.git/ ~/tmp/k8s > git pull ~/tmp/devops k8s remote: Enumerating objects: 12, done. remote: Counting objects: 100% (12/12), done. remote: Compressing objects: 100% (5/5), done. remote: Total 12 (delta 3), reused 8 (delta 3), pack-reused 0 Unpacking objects: 100% (12/12), 3.60 KiB | 263.00 KiB/s, done. From /Users/tnguyen/tmp/devops * branch k8s -> FETCH_HEAD
To clarify the result, we run git log
or git log --oneline
to see all the commit messages. Also, by running these commands on the old/big repository we can check all commits relevant to the K8s
directory.
There have been four commits as of writing these lines. If we look into the long list of commit messages of the original repo as the screenshot below, we can find out where these commit messages come.
This just copies commits relevant to the specific subdirectory.