Git如何删除历史记录中的大文件详解
前言
Git作为一个分布式的版本管理工具,代码仓库中是会保存所有历史记录的。虽然,Git的.gitignore文件里可以定义一些忽略文件的规则,但是,在我们提交代码的过程中,总会不小心误提一些没用的文件,如果文件中存在大文件,就会导致:就算我们把它删了重新提交,.git文件夹依然会占用较大的空间。
如何解决这个问题呢?其实,Git已经为我们提供了解决方案,就是被称为核弹级的命令filter-branch。这个命令可以用来修改历史提交记录,把不需要的文件永久地从历史记录中删除。
方法如下:
首先,我们需要找出大文件。
找出排名前5的pack记录:
gitverify-pack-v.git/objects/pack/pack-*.idx|sort-k3-g|tail-5
可以看到这样的信息:
1753e0b6aa1cd3ed27d1d14e8e569664c685e896blob446004384137970 ca12c545eae19d688ac840c7f0e2e623a1a4192bblob452628534140448 7a3265ee94c0ab25cf079ac8ccdf87f41d455d42blob5470849093171307 72590cee1315e32dada25535184dcee97c6f5af9blob11143231104823113887612 4cc1f9dcef1004355d2a595d45808e99f100dc4dblob114592569113703558184054
最后一条就是最大的一条记录,4cc1f9dcef1004355d2a595d45808e99f100dc4d是它的id。
找出该记录对应的文件:
gitrev-list--objects--all|grep4cc1f9dcef1004355d2a595d45808e99f100dc4d
可以看到:
4cc1f9dcef1004355d2a595d45808e99f100dc4dapp/src/main/assets/Android群英传.pdf
这个文件就是罪魁祸首,它占了有100多M的空间。
将该文件从历史记录中移除:
gitlog--pretty=oneline--branches--app/src/main/assets/Android群英传.pdf
重写所有commit,将该文件从Git历史中完全移除:
gitfilter-branch--index-filter'gitrm--cached--ignore-unmatchapp/src/main/assets/Android群英传.pdf'----all
到这里,历史记录中已经没有该文件了。不过运行filter-branch产生的日志还是会对该文件有引用,所以还需要运行以下几条命令,把该文件的引用完全删除:
rm-Rf.git/refs/original rm-Rf.git/logs/ gitgc gitprune
这个时候,再看文件夹,已经小了很多了。然后就可以push代码了,不过就是需要强制push:
gitpush--force
以上就是删除Git历史记录中大文件的过程。
当然filter-branch的作用还不止这些,比如它还可以用来修改历史提交记录中的用户名(username)和邮箱(email)等。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。