Git Repository Splitting
Splitting mono-repo into a logical repos by applying filters
git clone --bare https://github.com/egovernments/old-repository.git
cd old-repository.git
Remove all the unwanted branches
- git branch -D <branchname>
<branchname>
<branchname> ...
- git branch -D <branchname>
- Pick the folder you want separated out from entire repo
git filter-branch --subdirectory-filter rainmaker/ -- master
- Optionally remove few modules from previously applied filter, say if rainmaker folder has 7 modules out of which you need only
git filter-branch -f --prune-empty --index-filter 'git rm --cached --ignore-unmatch egov-search-indexer/ *egov-mdms-service-depreciated/* ' master
Check if repo structure is as needed, check current remote
git remote -v
Push to new repo
git push --mirror https://github.com/digit-egov/new-repository.git
Pick the folder you want separated out from entire repo
mkdir myrepo & cd myrepo & git init
Applied filters, add the folders that you need to separate
git config core.sparseCheckout true
git remote add -f origin git://
digit-egov/NEW-REPOSITORY-NAME.git
echo "path/within_repo/to/desired_subdir/*" > .git/info/sparse-checkout
git checkout [branchname] # ex: master
Push to new repo
git push -u origin master
To duplicate a repository without forking it, you can run a special clone command, then mirror-push to the new repository.
Create a new directory as per choice
Create a bare clone of the repository.
$ git clone --bare https://github.com/egovernments/old-repository.git
Mirror-push to the new repository. (you must create the new repository on GitHub. In these examples,
digit-egov/new-repository
ordigit-egov
/mirrored
are the mirrors.)$ cd old-repository.git $ git push --mirror https://github.com/digit-egov/new-repository.git
Remove the temporary local repository you created in step 1.
$ cd .. $ rm -rf old-repository.git
Mirroring a repository that contains Git Large File Storage objects
Open Terminal.
Create a bare clone of the repository. Replace the example username with the name of the person or organization who owns the repository, and replace the example repository name with the name of the repository you'd like to duplicate.
$ git clone --bare https://github.com/
egovernments
/old-repository.gitNavigate to the repository you just cloned.
$ cd old-repository.git
Pull in the repository's Git Large File Storage objects.
$ git lfs fetch --all
Mirror-push to the new repository.
$ git push --mirror https://github.com/
digit-egov
/new-repository.gitPush the repository's Git Large File Storage objects to your mirror.
$ git lfs push --all https://github.com/
digit-egov
/new-repository.gitRemove the temporary local repository you created in step 1.
$ cd .. $ rm -rf old-repository.git
Mirroring a repository in another location
If you want to mirror a repository in another location, including getting updates from the original, you can clone a mirror and periodically push the changes.
Open Terminal.
Create a bare mirrored clone of the repository.
$ git clone --mirror https://github.com/egovernments/repository-to-mirror.git
Set the push location to your mirror.
$ cd repository-to-mirror.git $ git remote set-url --push origin https://github.com/digit-egov/mirrored
As with a bare clone, a mirrored clone includes all remote branches and tags, but all local references will be overwritten each time you fetch, so it will always be the same as the original repository. Setting the URL for pushes simplifies pushing to your mirror. To update your mirror, fetch updates and push.
$ git fetch -p origin
$ git push --mirror
Related articles
https://help.github.com/en/articles/splitting-a-subfolder-out-into-a-new-repository
https://git-scm.com/docs/git-filter-branch
https://help.github.com/en/articles/duplicating-a-repository