Git中有时会误添加单个文件大小大于100M的文件,最后提交到远程仓库,如果没有之前已经配置过可以上传单个大文件的话,这个时候就会报错。如果确实需要上传大文件那就需要做配置,这里不做讲述。但大多数都不会上传大于100M的单文件,以下是解决方法:
一、查看文件大小靠前的几个
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 2 -g | tail -2
输出结果如下,依次是文件ID、文件类型、文件字节数、size-in-packfil、offset-in-packfile:
f628e3087f5e32c2c84f2f7d5879744df31511e1 blob 348670 347901 444010
3e2109358e393b52d0583c688ae8d3b36a4d3c41 blob 503391 146406 59027
这时会列出随机生成的文件名序号
二、怎么检查文件具体的名称,根据文件的ID(SHA1),查找文件路径有以下两种方法:
git rev-list --objects --all | grep a8c9f4aba231a4eb2ae52080e404ae6d7720da24
git whatchanged --all --find-object=a8c9f4aba231a4eb2ae52080e404ae6d7720da24
三、Git文件进行删除,根据上述查到的名称进行文件删除
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 文件名全称包括后缀名' --prune-empty --tag-name-filter cat -- --all
特别注意的是:若存在有多个分支,这个时候可能需要切换相应分支后再进行删除。重新大文件查看第一步骤进行验证,查看是否真的删除,如果已删除,将不会有任何信息返回。
四、Git执行清理历史记录命令
rm -rf .git/refs/original/;
git reflog expire --expire=now --all;
git gc --prune=now; 大文件的索引都切断了,这个时候进行垃圾回收
git gc --aggressive --prune=now;
五、Git强行推到远端仓库命令
git push --force --all