Often you may need to move a directory from one git repository to another. If you directly copy the folder to another git repository then all the commit history of your directory will be lost in the process and won’t be transferred to the new repository. In this article, we will learn how to move directory to another git repository while preserving its commit history.
How to Move Directory to Another Git Repository
Here are the steps to move directory to new repository, along with its commit history. Let us say you want copy directory data from primary-repo to secondary-repo.
1. Clone Repo
First we will clone repo which contains the directory to be transferred.
$ git clone https://github.com/USERNAME/PRIMARY-REPO.git
2. Change Directory
Next, change directory to newly cloned repository.
$ cd PRIMARY-REPO
3. Rewrite Git History
Next, you can use filter-branch command to rewrite git history by updating its branch history. Here is the syntax for the command.
$ git filter-branch --prune-empty --subdirectory-filter SUB_DIRECTORY_NAME BRANCH_NAME
In the above command,
- SUB_DIRECTORY_NAME – relative path of directory whose commit history you want to copy to new repo. It is basically the folder that you want to move.
- BRANCH_NAME – Name of the branch from which directory is filtered. For example, master, develop, working, etc. This is required because the directory may have commit history in multiple branches. This will tell git to pick commit history from the appropriate branch.
So if you want to copy the folder /home/ubuntu/data run the following command. At this point, git would have separated the commit history for your directory, from the required branch. Please note, once you run this command, git will retain only the directory that you want to move and remove all other contents from you repository. Even in this case, each file will be as per the last commit in the BRANCH_NAME you specified.
4. Create New Repository
Next, create new repository on GitHub, Gitlab or any other cloud-based Git provider.
Set the remote URL of new repository as the origin of your local directory.
$ git remote set-url origin https://github.com/USERNAME/NEW_REPO_NAME.git
Next, verify that the git origin URLs have been updated.
$ git remote -v
You will see something like the following.
# Verify new remote URL > origin https://github.com/USERNAME/NEW_REPO_NAME.git (fetch) > origin https://github.com/USERNAME/NEW_REPO_NAME.git (push)
Finally, push all the files to new repository.
$ git push -u origin BRANCH_NAME
In this article, we have learnt how to move folder to new repository. You can also use the same trick on an existing repository. In this case, you will need to create a new branch in existing repository and set that URL as the origin of your folder, so that when you push the folder, it goes to the new branch in remote repository. Thereafter, you can merge it with the master of your remote repository to integrate this folder.
If you simply copy/move the folder to a new location and and push it to a new/existing repository, its commit history will be lost. Using the above steps, you can isolate the past commits of a directory and include them in the new destination repo of the directory.