彻底删除提交到github上的大文件,为git工程瘦身

本文共有1616个字,关键词:git

git clone project时会把所有的文件都下载下来,如果某次提交不小心添加了一个大文件或者敏感的文件,即使再提交也无用,因为会在后台记录那个文件以便回溯,因此我们需要删除已经提交到github的文件,包括后台。
那怎么查看自己的仓库里有没有哪些大文件呢?很简单,用下面这个命令

git verify-pack -v .git/objects/pack/***.idx

然而它只给出了文件的MD5和大小,因此我们还需要找到对应的文件名

git rev-list --objects --all

拿到了文件之后就是删除了,来个简洁的命令

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *' --prune-empty --tag-name-filter cat -- --all

其中号处替换为要删除的文件,是通配符,默认删除所有文件,谨慎使用

  • filter-branch 是让git重写每一个分支,
  • --force 假如遇到冲突也让git强制执行,
  • --index-filter 选项指定重写的时候应该执行什么命令,要执行的命令紧跟在它的后面,在这里就是git rm --cached --ignore-unmatch password.txt ,让git删除掉缓存的文件,如果有匹配的话。
  • --prune-empty 选项告诉git,如果因为重写导致某些commit变成了空(比如修改的文件全部被删除),那么忽略掉这个commit。
  • --tag-name-filter 表示对每一个tag如何重命名,重命名的命令紧跟在后面,当前的tag名会从标注输入送给后面的命令,用cat就表示保持tag名不变。

紧跟着的-- 表示分割符,最后的--all 表示对所有的文件都考虑在内。

最后压缩无用的文件并提交到远程github仓库

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 --all --force

具体代码实现如下

#查看项目下占空间最大的5个文件
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5

#通过上条命令获取到的hash值 定位到具体文件
git rev-list --objects --all | grep 31e9dd55b9a407a7a76361060defa00507beb628

#从各个分支中删除相应文件,可以使用*通配符
git filter-branch --index-filter 'git rm --cached --ignore-unmatch *nwjc_mac*'

#清理
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 --all --force

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

pch18

(๑>ڡ<)☆谢谢老板~

使用微信扫描二维码完成支付

版权声明:如无特别说明,本文为作者原创,转载请在首行注明来源:https://pch18.cn/archives/499.html
添加新评论
暂无评论