假设要删除大文件yolov3Path.pth
1 垃圾回收
先进行垃圾回收,并压缩一些文件
$ git gc --prune=now
Git最初向磁盘中存储对象使用松散的格式,后续会将多个对象打包为一个二进制的包文件(packfile),以节省磁盘空间
.pack文件存储了对象的内容
.idx文件存储了包文件的偏移信息,用于索引具体的对象
2 查找大文件
使用下面命令显示所有commit及其所关联的所有对象中占用最大的文件:
$ git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -3 | awk '{print$1}')"
输出
e9461c55c3b8807351909cf7bb46eb22a8df5533 README.md b866711af76e7d7cc87d9828f8ddde8ea865d053 yolov3Path.pth
verify-pack -v *.idx:查看压缩包内容
3 删除指定的大文件
$ git filter-branch --force --index-filter "git rm -rf --cached --ignore-unmatch yolov3Path.pth" --prune-empty --tag-name-filter cat -- --all Rewrite bf551acd0ca40a5671bcf2d4cad83a999b8baf52 (10/16) (0 seconds passed, remaining 0 predicted) rm 'bigqin' Rewrite d1d31551ecb36d362fd1051152f1fc886e4df95c (11/16) (0 seconds passed, remaining 0 predicted) rm 'bigqin' Rewrite da902adff9f3f890aa4c3304c5ac6d1e14f589da (12/16) (0 seconds passed, remaining 0 predicted) rm 'bigqin' Rewrite c96090316c3600e6e190cb9f99cf14a58f6f09ca (13/16) (0 seconds passed, remaining 0 predicted) rm 'bigqin' Rewrite 9d6c9194d76c5e0aa6c9119445681c9fbdf735a3 (14/16) (1 seconds passed, remaining 0 predicted) rm 'bigqin' Rewrite b1e2f243a559547e3a0f5eaa18f6a31a35eaa57a (14/16) (1 seconds passed, remaining 0 predicted) rm 'bigqin' Rewrite ac49fbb891648b73bbd31b4e82b56bbd71254384 (14/16) (1 seconds passed, remaining 0 predicted) rm 'bigqin' .....
filter-branch 命令通过一个filter来重写历史提交,这个filter针对指定的所有分支(rev-list)运行。
–index-filter:过滤Git仓库的index,该过滤命令作用于git rm -rf --cached --ignore-unmatch bigqin。不checkout到working directory,只修改index的文件,速度快。
–cached会删除index中的文件
–ignore-unmatch:如果没匹配到文件,不会报错,会继续执行命令
最后一个参数file/directory是要被删除的文件的名字
–prune-empty:指示git filter-branch 完全删除所有的空commit。
-–tag-name-filter:将每个tag指向重写后的commit。
cat命令会在收到tag时返回tag名称
–-选项用来分割 rev-list 和 filter-branch 选项
–all参数告诉Git我们需要重写所有分支(或引用)。