Loading

.git目录文件过大

最近clone一个仓库发现文件夹巨大,查看具体文件体积并不大
后来发现是.git目录占用过多空间

显示pack内容

Git 往磁盘保存对象时默认使用的格式叫松散对象 (loose object) 格式
Git 时不时地将这些对象打包至一个叫 packfile 的二进制文件以节省空间并提高效率
而git verify-pack 命令就是用于显示已打包的内容

git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -3

VtK1aQ.png

sort命令中 -k 指定排序参照列, -n 依照数值的大小排序
tail命令 指定输出项数

输出具体对象内容

git rev-list 按照默认反向时间顺序,输出命令指定的commit objects
--objects 列出的提交引用的任何对象的对象ID
--all 全部匹配结果

git rev-list --objects --all | grep b098d1c7

VtKtx0.png

上述两个命令可以合并成一个
这样的输出效果更明显,方便
awk 命令是处理文本文件强大分析工具,{print$1} 表示每行按空格或TAB分割,输出文本中第一项

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

VtKHzt.png

重写历史(此后内容极具危险)

git重写历史中,以前常用到的就是
修改上一次提交

git commit --amend

而我们这一次所需要用到的内容是,“核弹级选项” git filter-branch
它可以修改大量的提交

--force 拒绝从现有的临时目录开始,强制执行改写操作
--index-filter 与tree-filter相比,不检查树,和git rm搭配使用,更快的生成版本
--ignore-unmatch 如果你想“完全忘记”一个文件,在输入历史记录时无关紧要
--prune-empty 表示如果修改后的提交为空则扔掉不要。实际可能虽然文件被删除了,但是还剩下个空的提交
--tag-name-filter cat 来简单地更新标签
--all 是针对所有的分支,注意前面多了一个 -- 这个是为了让分隔开git filter-branch 和 --all

crnn/trained_models_crnn_Rec_done_155_1084.pth 为你要删除的文件名

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch 'crnn/trained_models_crnn_Rec_done_155_1084.pth'"  --prune-empty --tag-name-filter cat -- --all

VtKOL8.png

如果你想删除整个文件夹历史

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

VtMEeU.png

更行清理优化

git for-each-ref 输出指定位置所有reflog条目,--format 指定带有特定字符的Object
git update-ref update reflog条目
git reflog expire 删除掉--expire时间早的reflog条目
git gc --prune= 对指定日期之前的未被关联的松散对象进行清理

git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

VtMSij.png

这时候查看磁盘占用空间

du -d 1 -h

VtMiQ0.png

更新到远程仓库

--verbose 详细输出运行log
--dry-run 做"真的update远程"以外所有工作

git push --force --verbose --dry-run

VtMZo4.png

"真的update"

git push --force

VtMQQx.png

最好的方法:不要把大文件放在git仓库

参考文章:
如何解决 GitHub 提交次数过多 .git 文件过大的问题? - 郑宇的回答 - 知乎

寻找并删除Git记录中的大文件
Pro Git
初次使用 git 的“核弹级选项”:filter-branch

posted @ 2019-06-04 13:22  bay1  阅读(10557)  评论(2编辑  收藏  举报