一、背景介绍
在日常的项目开发中,我们通常使用Git这个版本控制系统来管理我们的代码,但是有时候我们会因为一些原因需要删除一些过大的文件,这时候就需要使用Git来删除大文件。
二、为什么要删除大文件
当我们向Git提交代码时,会将所有文件的变化都记录下来。如果我们提交了一个过大的文件,不仅会占用大量的磁盘空间,还会导致Git仓库变大,使得其他人clone代码的时间变长。而且,如果我们想将代码部署到服务器上,那么过大的文件也会导致部署时间变长。因此,我们需要删除这些过大的文件。
三、删除大文件的三种方法
3.1 使用Git LFS
Git LFS是Git大文件存储的简称。它是一种Git扩展工具,可以为Git仓库中存储的大文件提供分离式存储,将大文件存储到一个专门的服务器上,可以免费使用LFS托管,也可以使用自己的私有LFS托管。使用Git LFS管理大文件的好处在于,我们可以把大文件从Git仓库中分离出来,将其存储在别处,这样可以减小Git仓库的大小,从而使其更快速、更容易备份和复制。
3.2 使用BFG Repo Cleaner
BFG Repo Cleaner是一款可以在Git代码库中查找和删除文件的工具,它比Git Filter-Branch命令用起来要简单得多。不仅可以删除大文件,还可以删除其他类型的不需要的文件。
使用BFG Repo Cleaner的步骤如下:
安装BFG Repo Cleaner
sudo apt-get install bfg
Clone代码仓库到本地
git clone --mirror git://example.com/some-big-repo.git
使用BFG Repo Cleaner删除大文件
bfg --strip-blobs-bigger-than 100M some-big-repo.git
推送修改到远程代码仓库
cd some-big-repo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive
git push
这些命令的含义是:–strip-blobs-bigger-than选项后面的100M表示删除大于100MB的文件。
3.3 使用Git Filter-Branch
Git Filter-Branch命令可以用于修改Git仓库的commit历史记录,可以删除所有commit中包含的某个文件或者文件类型。对于删除大文件,我们可以使用以下命令:
git filter-branch --tree-filter 'rm -f path/to/big_file' HEAD
其中path/to/big_file是需要删除的大文件的路径。
删除完毕后,还需要使用以下命令清理Git仓库中的无用对象:
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
这些命令的含义是:通过遍历Git仓库中的所有引用(branches、tags、remotes)找到包含原始commit记录的refs/original目录,删除其中的文件,接着清空reflog,最后进行一次垃圾回收,将无用的Git对象打包成新的pack文件,并删除之前的pack文件。