前几天发现github的仓库非常庞大,down下来有近一个G。虽然把大文件删除了,但是.git文件夹还是占用很大空间,查询资料发现是因为有些文件虽然被删除了,但是github还会保留它的历史日志。所以采用下面的方式将大文件彻底删除。
PS:如果不想费事又想clone的时候快一点,只需要在命令行后面加--depth=1,就会只clone最后一次commit的内容。例如
git clone https://github.com/Wuchenwcf/MyCode.git --depth==1
1.识别出最大的三个文件
git verify-pack -v .git/objects/pack/pack-8eaeb...9e.idx | sort -k 3 -n | tail -3
红色部分对应你github仓库目录下的相应位置,笔者的是
执行结果如下:
$git verify-pack -v .git/objects/pack/pack-44647d872a2ee43463eda7c6f620b9cd88a79a9a.idx | sort -k 3 -n | tail -3
296169a146c50dbc100a5d0ee5be87a45cd7cbb3 blob 50296832 49474116 291684796
aae2c1bf6109f2729502349722b4c3402626d755 blob 77762481 77330392 78759794
35047899fd3b0dd637b0da2086e7a70fe27b1ccb blob 100534272 100014418 191670176
2、查询大文件的文件名
git rev-list --objects --all | grep 35047899fd3b0dd637b0da2086e7a70fe27b1ccb
红色部分对应上一步的绿色部分
执行结果如下:
git rev-list --objects --all | grep 35047899fd3b0dd637b0da2086e7a70fe27b1ccb
35047899fd3b0dd637b0da2086e7a70fe27b1ccb C#/道路车流量统计1/Matlab/HeadlightTracking/for_redistribution/MyAppInstaller_web.exe
3、将该文件从历史记录的所有 tree 中移除
git log --pretty=oneline --branches -- C#/道路车流量统计1/Matlab/HeadlightTracking/for_redistribution/MyAppInstaller_web.exe
红色部分对应上一步的绿色部分
执行结果如下
git log --pretty=oneline --branches -- C#/道路车流量统计1/Matlab/HeadlightTracking/for_redistribution/MyAppInstaller_web.exe
504a94cc041285f5d9c3d9e40f0ffa3c02e1a07d 删除没用的代码
a821b64402c37f7efa01b6dca904ce6d8bdefa77 车辆检测
4、用 filter-branch 命令重写所有 commit 才能将文件从 Git 历史中完全移除。
git filter-branch --index-filter 'git rm --cached --ignore-unmatch C#/道路车流量统计1/Matlab/HeadlightTracking/for_redistribution/MyAppInstaller_web.exe'
红色部分对应第二步的绿色部分,注意不要忘记’符号
5、依次执行以下命令,便可删除
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git fsck --full --unreachable
git repack -A -d
git gc --aggressive --prune=now
git push --force