Split Git Repos
My website has grown over time.
First, I just had a site for the WhatsApp Viewer.
Then, I've added a blog.
Then, I've added my landing page to present myself as a software professional.
Then, I've added a gallery.
Then, I've added my resume.
Then, I've added a site about things I like.
Then, I've added cheatsheets.
I've noticed the repo was getting too big for my likes.
So I'd rather like to have subdomains with separated repos, like cheatsheets.andreas-mausch.de.
Here are some commands which were useful to me:
# Create a new copy of the existing repo
git clone <original_repo>
# This command keeps all files with this pattern: gallery.html gallery images/gallery _layouts/gallery.html
# All other files are deleted, and all commits which do not touch these files are dropped.
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- gallery.html gallery images/gallery _layouts/gallery.html' --prune-empty -- --all
# Now, this repo only contains files related to gallery stuff.
# But, there are still references in the .git folder to all the other files.
# We don't need them any longer and can save some space by shrinking the .git folder:
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc --aggressive --prune=now
git prune --expire now
Once we have created a new repo with only gallery-files inside, we can delete those files in the original repo.
cd <original_repo>
# This deletes all gallery related files from the repo
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch gallery.html gallery images/gallery _layouts/gallery.html' --prune-empty --tag-name-filter cat -- --all
# Now, run the same cleanup commands from above
Note: You need to force-push after the changes. Do this with care and be aware what the consequences of a force-push are!