背景:为什么.git比我仓库中的文件大很多
为什么我的git中只有一个1KB的README,但是.git却又1G多?当我想把这个git库push到gitee时,还会报错:
根据报错信息,可看出失败的原因是:有文件的大小超过1G,超过了限流值:100M。但是,我的仓库中只有1K,为什么会有1G的文件呢?
再回想一下,我之前曾提交过多个大文件,但是因为是无用的,就把它们都删了,并重新提交了,推测是跟这些提交有关,因为git能回退到某一版本,即能回退到删除文件之前的版本。那么,如果我误提交了一些大文件,该怎么从git中删除呢?
方案
查看git占用磁盘大小:
git count-objects -vH
松散对象size为1.34G,包对象size-pack为132.46M,总大小为1.47G。
1. 检查仓库中的大文件:
git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10
执行结果如下:
第三列即为文件的大小,第一列为SHA-1。
2. 关联SHA-1到对应的文件名
git rev-list --objects --all | grep {SHA-1}
执行结果如下:
本例中,最大的文件是test_file,这是之前误提交的一个大文件,虽然已经删除,但是git中任然存储相应的记录。
3. 重写提交历史
安装git-filter-repo:
pip install git-filter-repo
将git-filter-repo添加到Path,我的路径在这:
C:\Users\ xxx\AppData\Roaming\Python\Python37\Scripts
清理test_file:
git filter-repo --path test_file --invert-paths --force
执行大概需要40s,结果如下:
4. 清理残留数据
git reflog expire --expire=now --all
git gc --prune=now --aggressive
执行完上述步骤之后,查看.git,发现还是很大,于是继续重复上述步骤,删除所有无效文件,最后结果:
可以看到,清理完成之后,文件大小只有1.35K了。