Tutorial: Safely Reducing the Size of a Git Repository

Before starting any of these procedures, make sure to backup your repository.

Tutorial: Safely Reducing the Size of a Git Repository

Prerequisites:
  • A local Git repository.
  • Backup the repository before making changes.
  • Optional: Install tools like BFG Repo-Cleaner.
Step 1: Basic Repository Cleanup

1.1. Run Git Garbage Collection

Start by running the Git built-in garbage collection command, which can help clean up unnecessary files and optimize the repository.

bash 复制代码
cd /path/to/your/repo
git gc --aggressive --prune=now
  • --aggressive: More thorough cleanup.
  • --prune=now: Removes objects that are no longer needed.

1.2. Clean Reflogs

Reflogs record when the tips of branches and other references were updated in the repo. They can consume space, especially in large projects.

bash 复制代码
git reflog expire --expire=now --all
Step 2: Identify and Remove Large Files

2.1. Find Large Files

Use a script to find large files in your repository's history.

bash 复制代码
git rev-list --objects --all |
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' |
sort -n -k 3 |
tail -n 10

This command will list the top 10 largest objects in the repo.

2.2. Remove Large Files Using BFG

If you find large files that should not be in the repository, use BFG Repo-Cleaner, which is faster and simpler than git filter-branch.

First, download and run BFG:

bash 复制代码
java -jar bfg.jar --strip-blobs-bigger-than 100M /path/to/your/repo

2.3. Alternative: Use git filter-branch

If you prefer not to use BFG, you can manually remove large files with git filter-branch:

bash 复制代码
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch PATH_TO_LARGE_FILE" \
  --prune-empty --tag-name-filter cat -- --all

Replace PATH_TO_LARGE_FILE with the path to the file you wish to remove.

Step 3: Clone the Repository Afresh

After cleaning up the history, it might be beneficial to clone the repository afresh to start with a new, smaller .git directory.

bash 复制代码
cd ..
git clone --mirror /path/to/old/repo new-repo
cd new-repo
git reflog expire --expire=now --all
git gc --aggressive --prune=now
Step 4: Replace Old Repository

Once you are satisfied with the new repository's state, you can replace the old repository:

bash 复制代码
mv /path/to/old/repo /path/to/old/repo-old
mv new-repo /path/to/old/repo
Final Notes
  • After performing these actions, especially if you changed the history, you will need to force-push to any remotes and inform collaborators to re-clone the repository.
  • Always ensure you have backups and confirm that no critical data is lost during the cleanup.

This tutorial will guide you through reducing the size of your Git repository effectively and safely. Remember, these changes affect the repository's history, which can impact collaborative workflows.

相关推荐
知识即是力量ol2 小时前
研发实战:Git 规范化开发全流程指南
git·gitee·github
我是一只代码狗2 小时前
idea创建分支
git
知识即是力量ol4 小时前
Git 快速入门 (实习生视角)
git·gitee·github
Dontla5 小时前
Git撤销上一次提交(撤销提交,Git回退提交)git reset、git revert
git
wdfk_prog5 小时前
解决 `git cherry-pick` 引入大量新文件的问题
大数据·git·elasticsearch
fu的博客7 小时前
Git从删库到跑路
git·gitee·github
要加油哦~7 小时前
git 报错 | husky - pre-commit hook exited with code 1 解决
git
知识即是力量ol8 小时前
Git 实战指南:从分支管理到冲突解决
git·github·源代码管理
weixin_4624462320 小时前
Git 本地忽略 application-dev.yml 的最佳实践:不提交 .gitignore,不影响团队协作!
git
无限进步_1 天前
面试题 02.02. 返回倒数第 k 个节点 - 题解与详细分析
c语言·开发语言·数据结构·git·链表·github·visual studio