Slim down your git repository size¶
Table of Contents
I’ve recently moved to Github for my private repositories and was in the process of migrating my repositories over. I wanted to be a good citizen and reduce my repository size as much as possible by excluding binaries I had previously committed on an iOS project.
Here’s how I did it.
Removing the files from your existing git repository¶
First, we’ll need to add our large files to our .gitignore and tell git to stop tracking them.
In my case, I ignored these frameworks from an iOS project I’m working on, I can easily re-install them using package manager CocoaPods.
# .gitignore
Pods/Realm
Pods/Crashlytics
Pods/Fabric
Pods/TwitterKit
Pods/Digits
Pods/TwitterCore
We’ll need to tell git to stop tracking these files.
git rm -r --cached Pods/Realm
git rm -r --cached Pods/Crashlytics
git rm -r --cached Pods/Fabric
git rm -r --cached Pods/TwitterKit
git rm -r --cached Pods/Digits
git rm -r --cached Pods/TwitterCore
You’ll have to commit and push your changes.
Remember to add your updated .gitignore.
# Your removed cached items should be automatically added
git add .gitignore
git commit -m "Removed large files for prune"
git push origin master
Pruning the repository¶
We’ll use a popular tool called bfg which removes large files like git-filter-branch does.
Prepare the repository¶
Create a bare clone of your git repository:
git clone --mirror git@github.com:lakhman/fat-repo.git
Note
Note This will clone your actual core repository history, and so you will not see your files here.
Create a backup of the repository:
cp -r fat-repo.git fat-repo.git-backup
Remove the files from your local repository¶
Remove all files larger than 1M.
bfg -b 1M fat-repo.git
This will remove all files over 1000K, except HEAD (which is protected). View all the options by reading the docs or running bfg.
The bfg command should output a command like so, you need to run this in your project root to finalize the process.
# Jump into our project
cd fat-repo.git
# reflog - Process our reference logs as we've manually updated them
# gc - Cleanup unnecessary files and optimize the local repository
git reflog expire --expire=now --all && git gc --prune=now --aggressive
You can view more information about these commands here:
gc | https://git-scm.com/docs/git-gc |
reflog | https://git-scm.com/docs/git-reflog |
Push your changes to your remote¶
Finally, we’ll want to push our changes to a remote repository.
Tip
Use git config --list to view your settings.
It’s best to do this in a new repository, create one (I’ll be using Github, we’ll call it slim-repo).
git remote remove origin
git remote add origin git@github.com:lakhman/slim-repo.git
git push -u origin master
If you’re using Github, you can see your repository size by going to your Account Settings > Repositories.
You should now have a slimmer repository, remember you’ll have to clone your repository again as the references will have changed during this the process.