Extracting a git submodule from a git module
To turn a directory within a Git repository into a separate submodule and retaining its history using the Git command line client, follow these steps:
Step 1: Extract the Directory's History
Navigate to your main repository's local clone. If you haven't cloned the repository locally, do so by using Git Clone
Filter the directory you want to turn into a submodule to retain its history. You can use
git subtree split
for this purpose. For example, to extract a directory namedsubdir
, you can use:git subtree split -P subdir -b temp-branch
This command creates a new branch (
temp-branch
) containing the history of the changes withinsubdir
.
Step 2: Create a New Repository for the Submodule
Create a new repository on a platform like GitHub, GitLab, Bitbucket, or on your server. This repository will host the content of your submodule.
Step 3: Push the Extracted History to the New Repository
Clone the new repository to your local machine:
git clone <new-repository-url> submodule-repo cd submodule-repo
Pull the extracted history from the original repository into this new repository:
git pull <path-to-main-repo> temp-branch:main
Here,
<path-to-main-repo>
is the file path to your main repository's local clone, andmain
is the default branch of your new submodule repository.Push the changes to the new submodule repository:
Step 4: Remove the Directory from the Original Repository and Add the Submodule
Switch back to the main repository and remove the directory that you're converting into a submodule:
Add the new repository as a submodule to the original repository:
Step 5: Finalize and Push the Changes
Push the changes to your main repository:
Summary
This process involves:
Extracting the history of a directory into a new branch using
git subtree split
.Creating a new repository for the submodule and pushing the extracted history to it.
Removing the original directory from the main repository and adding the new repository as a submodule.
Make sure to replace placeholders like <repository-url>
, <new-repository-url>
, subdir
, temp-branch
, and main
with your actual repository URLs, directory name, branch names, and the default branch name of your repositories.