zoukankan      html  css  js  c++  java
  • 使用bfg快速清理git历史大文件

    使用bfg快速清理git历史大文件

    之前写过一篇的,使用的git命令清理的大文件,但是我3G多的git,.git文件夹里面的pack就3G多,而且是个好几年并且在持续开发的项目,里面的提交成千上万了,每次使用git filter-branch,都要好几个小时,我研究了一下,要彻底清理项目中的那一堆大文件,只要要用脚本连续跑两天。。。
    最近发现了一个方案,使用bfg,我仅仅十几分钟就处理完了
    原先的方案:https://blog.csdn.net/qq_36254947/article/details/108601940

    步骤

    • 解除保护分支
      默认情况下,git项目是有一个保护分支的
      在这里插入图片描述

    image-20200911181110097

    • 拉取代码

    注意:需要ssh拉取,http不行(ssh拉取需要配置ssh密钥)
    git配置ssh密钥

    git clone --mirror git项目的ssh地址
    # 拉取的是 项目名.git  文件夹,这是Git项目中的.git文件夹
    
    • 查看大文件
    # 进入项目文件夹
    cd xxx.git
    # 查询大文件
    git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')"
    # tail -n 代表查看前n个大文件,
    
    • 清理文件夹
    java -jar bfg-1.13.0.jar --delete-folders 清理的文件夹名字  本地git项目地址 
    # 注意:文件夹名字,而不是文件夹路径,要小心别把其他文件夹中的同名的文件夹删除了
    # 若是jar包放到了 git项目中,不需要添加  本地git项目地址 ,但最好不要放到.git文件夹中
    
    • 清理文件
    java -jar bfg-1.13.0.jar --delete-files 删除的文件名 本地git项目地址
    # 注意:这是文件名只是名字部分,不包含路径
    
    • 清理无效文件
    # 删除的文件和文件夹,需要这一步才会真正清除
    git reflog expire --expire=now --all && git gc --prune=now --aggressive
    
    • 查看大小
    git count-objects -vH 
    # 此时就能发现项目小了
    
    • 推送
    git push -f  # -f 强制推送
    

    脚本

    # 开始
    time1=$(date)
    echo 开始时间 $time1
    
    echo 拉取项目
    git clone --mirror git@1xxxx.git
    jarpach="D:	est1fg-1.13.0.jar"  # jar包地址
    
    cd "D:转换	est1xxx.git"  # git项目地址
    
    git count-objects -vH
    echo 
    echo 
    echo 
    echo 清理文件提交
    echo 
    # 将需要清理的文件列出来
    java -jar $jarpach --delete-folders 文件夹1		
    java -jar $jarpach --delete-folders 文件夹2
    java -jar $jarpach --delete-files dist.*
    java -jar $jarpach --delete-files 文件2
    
    echo 
    echo 
    
    echo 清理无效文件
    echo git reflog expire --expire=now --all && git gc --prune=now --aggressive
    echo 
    echo 
    echo 清理完成
    
    git count-objects -vH
    
    echo 
    time2=$(date)
    echo 开始时间 $time1 ---结束时间 $time2
    
    

    清理完之后,若是没有问题,进入项目文件夹使用git push -f 强制推送即可,之后别忘记清理服务器

    在这里插入图片描述
    在这里插入图片描述

    清理服务器

    清理完文件之后,需要清理一下服务器

    #从git服务器进入这个项目的.git文件夹
    cd /var/opt/gitlab/git-data/repositories/xx/.git  #根据配置可能不同
    # 清理文件
    git gc --prune=now --aggressive
    #查看大小
    git count-objects -vH
    

    注意:我清理完之后,git服务器使用http不能拉取代码了,重启服务器解决了

  • 相关阅读:
    Web进程被kill掉后线程还在运行怎么办?
    Spring Boot学习(二):配置文件
    POI实现excel的数据验证
    Spring Boot学习(一):入门篇
    lombok学习
    Java设计模式:单例模式
    关于org.springframework.web.filter.CharacterEncodingFilter的学习
    毕业三年,拿了北京户口,从年薪20W到年薪40W,说一点对后人有用的经验
    北漂去帝都大医院求医到底有多难?我的真实经历,真的是一路坎坷与辛酸~
    阿里面试官让我讲讲Unicode,我讲了3秒说没了,面试官说你可真菜
  • 原文地址:https://www.cnblogs.com/ziyue7575/p/14991265.html
Copyright © 2011-2022 走看看