【Git】Git瘦身,清理Git历史提交/.git大文件清理(云效、UI 自动化项目)

2024-01-18 02:30

本文主要是介绍【Git】Git瘦身,清理Git历史提交/.git大文件清理(云效、UI 自动化项目),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目前项目是存在云效(codeup.aliyun.com)上
本地清理后,还需要到云效上清理「存储空间管理」

      • 一、清理/瘦身效果
      • 二、到底是什么在占空间?
          • 1、先看一下项目里,什么最占空间?
          • 2、往下看在/.git里,什么最占空间?
      • 三、清理/瘦身过程
          • 1、git命令修改大文件提交记录
            • (1)查看历史提交中占用空间最多的10个文件
            • (2)重写提交记录,删除提交记录里面的大文件(删`data/apks/large.apk`)
            • (3)清理本地缓存+强推到远端
            • (4)本项目是存在云效codeup上,还需要到云效上手动清理下服务器缓存
            • (5)本地查看 & 远程查看效果
          • 2、BFG工具
            • (1)BFG下载到本地,改个名字-> bfg.jar
            • (2)镜像下载待瘦身项目
            • (3)用BFG清理文件
            • (4)本地清理+提交到远程

一、清理/瘦身效果


清理前:451.11M


清理后:12.68M
在这里插入图片描述

结论:清理效果喜人,清除了97%无用大文件提交 🥳




二、到底是什么在占空间?

在项目不断提交过程中,提交过一些大文件如:apk,ipa文件,
这类文件动不动3、40M,就算之后删掉这些大文件,.git提交里还是存着——

就这样在不断提交中,把整个项目扩张成一个非常大/占空间的项目。


1、先看一下项目里,什么最占空间?
~/project (xx ✔)du -d 1 -h 
524K    ./page48K    ./.pytest_cache16K    ./shell
4.0K    ./__pycache__
216K    ./common
2.2M    ./log0B    ./report
482M    ./.git
1.6M    ./data
684K    ./testcases40K    ./.idea
487M    .

首先确定项目里,最占空间的是.git

482M    ./.git
2、往下看在/.git里,什么最占空间?
/.git (master ✔)du -d 1 -h
448M	./objects
4.0K	./info12K	./logs60K	./hooks
8.0K	./refs
448M	.
# 448M	./objects 最大/.git/objects (master ✔)du -d 1 -h
448M	./pack0B	./info
448M	.
# 448M	./pack 最大.git/objects/pack (master ✔) ᐅ ll
total 916904
-r--r--r--  1 xxx  staff   287K Sep 15 17:31 pack-qqqqqqqqq.idx
-r--r--r--  1 xxx  staff   447M Sep 15 17:31 pack-wwwwwwwww.pack
# 447M Sep 15 17:31 pack-wwwwwwwww.pack 最大

破案,.git 里最占空间的是——/objects/pack
我们本次清理, 其实就是清理/objects/pack里的大文件。





三、清理/瘦身过程

⚠️⚠️⚠️
都直接在master分支操作,提前做好备份
⚠️⚠️⚠️

有2种方法清理:
(1)git命令修改大文件提交记录
(2)BFG工具


1、git命令修改大文件提交记录
(1)查看历史提交中占用空间最多的10个文件
project (master ✔)git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')"781f20bbd24b3c23eb7a706044ad6147cd9931b0 data/apks/large.apk
8c38ebb58c15adf81bb297db883e2c29eb1f64f5 data/apks/large.apk
cf7fe36048b822bc9c1784a6d68dd1ded177dd29 data/apks/large.apk
ff99a5b3486af7e47af3136d7630d18c3f8a0a14 data/apks/large.apk
878fe9c837664bc57082a011e16a779ec7562f4b data/apks/large.apk
ec9272fcbfc7e1dc3e318fe8c5805066a420b451 data/apks/large.apk
332bccff3731c2f67d8994908887bc9ae2131781 data/apks/large.apk
6aa7f12c992ec6a19372d13a6d1b47b0aef95e18 data/apks/large.apk
15525f8df6f2a04c5bb7b40b78a8959762c2f3db venv/lib/python3.9/site-packages/lxml/etree.cpython-39-darwin.so

提交最多的就是data/apks/large.apk

(2)重写提交记录,删除提交记录里面的大文件(删data/apks/large.apk
project (master ✔)git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch data/apks/large.apk' --prune-empty --tag-name-filter cat -- --all
WARNING: git-filter-branch has a glut of gotchas generating mangled historyrewrites.  Hit Ctrl-C before proceeding to abort, then use analternative filtering tool such as 'git filter-repo'(https://github.com/newren/git-filter-repo/) instead.  See thefilter-branch manual page for more details; to squelch this warning,set FILTER_BRANCH_SQUELCH_WARNING=1.
Proceeding with filter-branch...Rewrite xxxccd26da5ecca698b61f85a0be378 (330/991) (41 seconds passed, remaining 82 predicted)    rm 'data/apks/large.apk'
Rewrite fae60972169db924e4e38ae2bbc5987a786224f7 (794/991) (98 seconds passed, remaining 24 predicted)    rm 'data/apks/large.apk'
Rewrite xxxc8cfe79b44e98d85f430b86c40af (803/991) (99 seconds passed, remaining 23 predicted)    rm 'data/apks/large.apk'
Rewrite xxx0394d9776a885567ffdb9368943 (983/991) (121 seconds passed, remaining 0 predicted)     
Ref 'refs/heads/master' was rewritten
Ref 'refs/heads/xxx' was rewritten
Ref 'refs/heads/qqq' was rewritten
Ref 'refs/heads/www' was rewritten
Ref 'refs/heads/eee' was rewritten
Ref 'refs/heads/rrr' was rewritten
Ref 'refs/heads/ttt' was rewritten
(3)清理本地缓存+强推到远端
rm -rf .git/refs/original/
git reflog expire --expire=now --all && git gc --prune=now --aggressivegit push --force
git remote prune origin  
(4)本项目是存在云效codeup上,还需要到云效上手动清理下服务器缓存

在这里插入图片描述

(5)本地查看 & 远程查看效果

本地:

project (master ✔)du -d 1 -h
252K	./page16K	./shell
104K	./common0B	./log0B	./report13M	./.git
1.6M	./data
212K	./testcases15M	.

远程:
在这里插入图片描述
清理完成✅



2、BFG工具
(1)BFG下载到本地,改个名字-> bfg.jar

BFG下载

(2)镜像下载待瘦身项目

$ git clone --mirror git://xxx.com/project.git

(3)用BFG清理文件

文件:large.apk

java -jar bfg.jar --delete-folders .git --delete-files large.apk  --no-blob-protection  project.gitUsing repo : /Users/xxx/project.gitFound 0 objects to protect
Found 19 commit-pointing refs : HEAD, refs/heads/xxx, refs/heads/www, ...Protected commits
-----------------You're not protecting any commits, which means the BFG will modify the contents of even *current* commits.This isn't recommended - ideally, if your current commits are dirty, you should fix up your working copy and commit that, check that your build still works, and only then run the BFG to clean up your history.Cleaning
--------Found 1298 commits
Cleaning commits:       100% (1298/1298)
Cleaning commits completed in 636 ms.
(4)本地清理+提交到远程
cd project.git
git reflog expire --expire=now --all && git gc --prune=now --aggressivegit push --force

这篇关于【Git】Git瘦身,清理Git历史提交/.git大文件清理(云效、UI 自动化项目)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617870

相关文章

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

Python实现Microsoft Office自动化的几种方式及对比详解

《Python实现MicrosoftOffice自动化的几种方式及对比详解》办公自动化是指利用现代化设备和技术,代替办公人员的部分手动或重复性业务活动,优质而高效地处理办公事务,实现对信息的高效利用... 目录一、基于COM接口的自动化(pywin32)二、独立文件操作库1. Word处理(python-d

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于