Git 移除仓库数据
如果不小心在仓库中添加了很大的文件,仅通过撤销操作无法彻底从仓库中删除,.git目录还是很大.需要通过以下的方式,将添加的文件彻底删除.
1. 确定出大容量的文件
如果知道大容量文件的名字,则不需要此步骤.
先整理空间,将小碎文件合并成大文件:
git gc
执行 count-objects 命令来快速的查看占用空间大小:
$ git count-objects -v
count: 7
size: 32
in-pack: 17
packs: 1
size-pack: 4868
prune-packable: 0
garbage: 0
size-garbage: 0
查看占用空间最大的三个文件:
$ git verify-pack -v .git/objects/pack/pack-29...69.idx \
| sort -k 3 -n \
| tail -3
dadf7258d699da2c8d89b09ef6670edb7d5f91b4 commit 229 159 12
033b4468fa6b2a9547a70d88d1bbe8bf3f9ed0d5 blob 22044 5792 4977696
82c99a3e86bb1267b236a4b6eff7868d97489af1 blob 4975916 4976258 1438
查看最大容量文件名称:
$ git rev-list --objects --all | grep 82c99a3
82c99a3e86bb1267b236a4b6eff7868d97489af1 git.tgz
2. 移除大容量文件
如果确定出大容量的文件名称是git.tgz,则通过如下方式移除.
使用以下命令可以轻松地查看哪些提交对这个文件产生改动:
$ git log --oneline --branches -- git.tgz
dadf725 oops - removed large tarball
7b30847 add git tarball
必须重写 7b30847 提交之后的所有提交来从 Git 历史中完全移除这个文件.使用 filter-branch 命令,这个命令在 重写历史 中也使用过:
$ git filter-branch --index-filter \
'git rm --ignore-unmatch --cached git.tgz' -- 7b30847^..
Rewrite 7b30847d080183a1ab7d18fb202473b3096e9f34 (1/2)rm 'git.tgz'
Rewrite dadf7258d699da2c8d89b09ef6670edb7d5f91b4 (2/2)
Ref 'refs/heads/master' was rewritten
指令解析:
–index-filter 修改在暂存区或索引中的文件;
git rm --cached 从索引中移除文件;
–ignore-unmatch 如果尝试删除的模式不存在时,不提示错误;
移除任何包含指向那些旧提交的指针的文件:
$ rm -Rf .git/refs/original
$ rm -Rf .git/logs/
重新打包:
git gc
看看省了多少空间:
git count-objects -v
从 size 的值看出,这个大文件还在你的松散对象中,并没有消失;但是它不会在推送或接下来的克隆中出现,这才是最重要的。 如果真的想要删除它,可以通过有–expire 选项的 git prune 命令来完全地移除那个对象:
git prune --expire now
在看看省了多少空间:
git count-objects -v