前言
今天突然拉取一个新的代码仓库,发现仓库很大,但是看最新的代码又没有大文件。忽然发现.git目录有500多M。
处理
-
- 首先先找出git中最大的文件
[root@localhost feng]# git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5
57b5c8d4ff4182bd1cf34123de706e011059ee7d blob 554937 493778 587087003 1 00f2a81800c0e3af0c135ba6224e849f31dba71a
91c4bc83dacc6cb408d35e59cd891976a73b4467 blob 649153 47009 4398321
00f2a81800c0e3af0c135ba6224e849f31dba71a blob 2025809 1697306 585389697
99734f1a2dbe7b7a386253212312302b003b94a1 blob 9277146 2117316 16780
5342a7adb3840d559a47be4a2d674f766b7f42e1 blob 610603142 580550838 4838859
可以看到5342a7adb3840d559a47be4a2d674f766b7f42e1这个文件特别大,比其它文件大了两个数量级
-
- 根据文件id查询文件路径
[root@localhost feng]# git rev-list --objects --all | grep 5342a7adb3840d559a47be4a2d674f766b7f42e1
5342a7adb3840d559a47be4a2d674f766b7f42e1 target/xxx.jar
-
- 移除文件
git log --pretty=oneline --branches -- target/xxx.jar
-
- 删除历史记录
[root@localhost feng]# git filter-branch --index-filter 'git rm --cached --ignore-unmatch target/xxx.jar'
Rewrite cacc87f4a6935b7203d417e420bd409b1ef3fcfa (11/21)rm 'target/xxx.jar'
Rewrite bed568ac414c5df8d0fa590927c37e70b15fe69e (21/21)
Ref 'refs/heads/master' was rewritten
-
- push
git push --force --all
需要在
gitlab里面取消分支protected.(settings/repository/Protected Branches)
-
- 清除本地缓存
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
git prune
总结
最好是在代码提交前,将不需要提交的文件放到.gitignore,避免不必要的问题。git仓库里面只提交代码,不要把一些中间产物也提交到仓库。如果接手别人的项目,可以按本文的方式,将大文件历史记录删除,避免别人拉取代码很慢。