Git(七).git 文件夹瘦身,GitLab 永久删除文件

news2024/11/25 13:29:09

目录

    • 一、问题背景
    • 二、问题复现
      • 2.1 新建项目
      • 2.2 上传大文件
      • 2.3 上传结果
    • 三、解决方案
      • 3.1 GitLab备份与还原
        • 1)备份
        • 2)还原
      • 3.2 删除方式一:git filter-repo 命令【推荐】
        • 1)安装
        • 2)删除本地仓库文件
        • 3)重新关联远程仓库
        • 4)删除远程仓库文件
        • 4)clean up 清理远程仓库
      • 3.3 删除方式二:git branch-filter 命令【不推荐】
        • 1)删除本地仓库文件
        • 2)删除远程仓库文件
        • 3)重新 repack 远程分支到本地

一、问题背景

由于项目在打 Docker 包的时候,需要将前端的包也打到 Docker 容器中,所以将前端包和前端的 Dockerfile 文件都放在了后端的 Git 目录下。

久而久之,由于前端包的更新迭代,Git 上面会一直保留前端包的历史版本,所以整个后端的 .git 越来越大,截至目前已经有 2.44G 了。每次有新的小伙伴加入 git 后都需要花很长时间来拉取代码,苦不堪言,而且 Jenkins 上面新建项目的拉取也会超时。

二、问题复现

2.1 新建项目

在 GitLab 上新建一个项目 my-test

在这里插入图片描述

我们可以看到,新建好的项目,默认只有 20KB

在这里插入图片描述

2.2 上传大文件

执行命令将项目克隆到本地:

git clone http://xxxx/xxx/xxx.git

此时,.git 文件夹大小为 30.7KB

为了更加全面地测试,我们创建两个分支,并且分别上传文件。

分支、文件结构对应关系如下:

  • dev-test1 分支

    | - pdf 文件夹

    ​ | - test_1.pdf 文件,12.8MB

    ​ | - test_2.pdf 文件,12.8MB

  • dev-test2 分支

    | - pdf 文件夹

    ​ | - test_1.pdf 文件,12.8MB

    ​ | - test_2.pdf 文件,12.8MB

相关命令如下:

# 创建dev-test1分支
git checkout -b dev-test1
git add -A .
git commit -m "update test1"
git push origin dev-test1

# 创建dev-test2分支
git checkout -b dev-test2
git add -A .
git commit -m "update test2"
git push origin dev-test2

2.3 上传结果

将大文件上传到 GitLab 后,仓库的大小如下:

  • .git11.2MB
  • GitLab11.3MB

在这里插入图片描述

三、解决方案

注意:操作前要保证是最新版本。

3.1 GitLab备份与还原

1)备份

在操作之前,我们要先备份 GitbLab 中的项目。最简单的方式就是直接将项目导出来。

在 GitLab 上打开项目,进入菜单 Settings -> General -> Advanced,点击 Expand 打开折叠。

在这里插入图片描述

点击 Export project

在这里插入图片描述

可以看到提示,这个导出是一个异步的操作,当导出完毕之后会将通知发送到邮箱。

在这里插入图片描述

邮件中会有一个下载链接,点击链接下载,保存24小时。

在这里插入图片描述

下载后文件如下,文件名格式为:日期_时分秒_用户名_项目名.tar.gz

在这里插入图片描述

2)还原

点击首页的 New project

在这里插入图片描述

选择 Import project

在这里插入图片描述

选择 GitLab export

在这里插入图片描述

输入项目名称,选择我们之前导出的 .tar.gz 文件,点击 Import project

在这里插入图片描述

还原完毕,分支和大小都在。

在这里插入图片描述

3.2 删除方式一:git filter-repo 命令【推荐】

  • git-filter-repo 官网: https://github.com/newren/git-filter-repo
  • python 官网: https://www.python.org/

注意:git-filter-repo 工具需要依赖 Git 和 Python。

1)安装
# 安装(pip是Python自带的安装工具)
pip install git-filter-repo
# 查看版本
git-filter-repo --version

执行结果:

在这里插入图片描述

注意:git-filter-repo 需要在一个刚刚 clone 下来的仓库中进行操作,否则会操作失败。

Aborting: Refusing to destructively overwrite repo history since
this does not look like a fresh clone.
(expected at most one entry in the reflog for HEAD)
Please operate on a fresh clone instead. If you want to proceed
anyway, use --force.

在这里插入图片描述

2)删除本地仓库文件

git clone 到本地后立即执行如下命令:

(不要做切换分支等操作,否则会报错,删除重新克隆才行。)

# 模糊匹配,删除所有pdf文件(会同时删除pdf文件夹)
git filter-repo --path-glob '*.pdf' --invert-paths

# 补充:精确匹配,仅删除pdf/test_1.pdf
git filter-repo --path-glob 'pdf/test_1.pdf' --invert-paths

执行结果如下:

在这里插入图片描述

git filter-repo 命令本身是用来将处理后的本地仓库重新推送到新的远程仓库用的,所以执行命令之后,查看 .git/config 配置文件,里面远程仓库的内容都被清空了:

在这里插入图片描述

执行之后,查看本地 .git 文件夹大小,从 11.2MB 直降至 32.8KB

3)重新关联远程仓库

重新关联远程仓库的命令如下:

git remote add origin https://git.xxx.cn/acgkaka/my-test.git
4)删除远程仓库文件

执行如下命令,将本地仓库的改动强制推送到远程仓库即可。

git push --force origin --all

执行结果如下:

在这里插入图片描述

此时,GitLab 的远程仓库大小还是 11.2 MB,并无效果,别担心,还有最后一步操作。

在这里插入图片描述

4)clean up 清理远程仓库

做完上面的操作之后,等待半小时,是的,等待30分钟,因为 GitLab 不会清理半小时内提交的文件。

在 GitLab 上打开项目,进入菜单 Settings -> Repository -> Repository cleanup,点击 Expand 打开折叠。

在这里插入图片描述

在使用 clean up 时,需要提交一个文件,这个文件就是文件根目录下的 .git/filter-repo/commit-map

在这里插入图片描述

可以看到提示,这个导出是一个异步的操作,当cleanup完毕之后会将通知发送到邮箱。

在这里插入图片描述

邮件中会说明 cleanup 后的仓库大小,为 0.1MB

在这里插入图片描述

再去 GitLab 查看远程仓库大小,从 11.3MB 直降至 51KB,瘦身成功。

在这里插入图片描述

3.3 删除方式二:git branch-filter 命令【不推荐】

注意: 目前经过尝试,发现 git branch-filter 虽然可以删除分支中的文件历史、提交记录,但是并不会减少 GitLab 中远程仓库的大小。

1)删除本地仓库文件

可以直接操作删除所有分支的文件,但是要注意必须保证所有分支都是最新代码才行。

也可以切换到具体分支,执行 git pull 拉取最新代码后,再进行删除,只要去除后面的 -- --all即可。

# 模糊匹配,删除所有pdf文件(会同时删除pdf文件夹)
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch '*.pdf'" --prune-empty --tag-name-filter cat -- --all

# 补充:精确匹配,仅删除pdf/test_1.pdf
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch 'pdf/test_1.pdf'" --prune-empty --tag-name-filter cat -- --all

执行结果如下,可以看到 dev-test1dev-test2 分支被重写了。

在这里插入图片描述

2)删除远程仓库文件

执行如下命令,将本地仓库的改动强制推送到远程仓库即可。

# 推送本地所有分支到远程
git push --force --all

执行结果如下,可以看到 dev-test1dev-test2 分支被强制更新了。

在这里插入图片描述

我们可以去 GitLab 上面看下提交记录,"如果之前的提交只涉及被删除文件的话,对应提交记录就会被清空,如果提交中除了被删除文件之外还包含其他文件,那么提交记录和其他文件都会被保留,不受影响。

在这里插入图片描述

3)重新 repack 远程分支到本地

执行如下命令,删除 refs/original 文件夹,并重新更新远程仓库到本地。

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

执行之后,查看本地 .git 文件夹大小,从 11.2MB 直降至 32KB

再次声明,这种方式虽然可以删除分支中的文件历史、提交记录,但是并不会减少 GitLab 中远程仓库的大小。远程仓库大小依然为 11.3MB。(有大佬知道后面怎么处理的,欢迎评论补充)

在这里插入图片描述

整理完毕,完结撒花~ 🌻





参考地址:

1.使用 git-filter-repo 清理 git 历史记录,https://nyakku.moe/posts/2020/06/12/use-git-filter-repo-clean-git-history.html

2.利用git-filter-repo无缝迁移git项目,https://zhuanlan.zhihu.com/p/465078705

3.git: 如何减少.git文件的大小?https://blog.csdn.net/LOI_QER/article/details/107911115

4…git文件过大,github仓库瘦身,https://blog.csdn.net/luchengtao11/article/details/82531044

5.从Git仓库(GitLab)中彻底去除大文件,https://zhuanlan.zhihu.com/p/589903338

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1161387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图的广度优先遍历的单源路径、无权图的最短路径问题、BFS性质附Java代码

目录 使用BFS求解单源路径问题 BFS重要性质 无权图的最短路径问题 使用BFS求解单源路径问题 import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.Queue;public class SingleSourcePath {private Graph G;private i…

Greenplum管理和监控工具-gpcc-web介绍

Greenplum管理和监控工具-gpcc-web介绍 1. gpcc-web简介 ​ gpcc(Greenplum Command Center)的Web用户界面是一个强大的工具,它可以帮助用户管理Greenplum数据库集群,提高效率,优化性能,并确保数据的安全…

安防监控项目---Cortex-A9和zigbee传感器数据上传至网页

文章目录 前言一、A9平台数据的采集与上传二、共享内存上传数据到CGI三、设备代码总结 前言 书接上期,我们大概来梳理一下,已经完成的需求有哪些了,从html下发指令控制Cortex-A9平台硬件,其中主要实现的有控制LED,蜂鸣器&#xf…

AI大模型时代网络安全攻防对抗升级,瑞数信息变革“下一代应用与数据安全”

AI与大模型技术加速普及,安全领域也在以创新视角聚焦下一代应用安全WAAP变革,拓展新一代数据安全领域。近日瑞数信息重磅发布了瑞数全新API扫描器、API安全审计、数据安全检测与应急响应系统及分布式数据库备份系统四大新品。此次发布在延续瑞数信息Bot自…

【中国知名企业高管团队】系列55:奇瑞汽车

昨天华研荟介绍了吉利集团的现状,创始人李书福先生的故事,以及吉利集团的现任高管团队。我们了解到现在的吉利集团品牌多元化,吉利汽车只是其中的一个品牌和产业集团,整个吉利集团有十余个汽车品牌,还有多个网约车品牌…

力扣第416题 *** 分割等和子集 c++ 新题 动态规划 中的 01背包问题

题目 416. 分割等和子集 中等 相关标签 数组 动态规划 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释…

qt 系列(二)---qt designer通过设置控件样式表进行背景颜色设置

1. 前言 一般Layouts不可以进行改变样式表,当我们想修改背景样式表,同时又不改变其他控件的颜色时,可以选择List View 控件改变背景颜色。 2. 设置背景 (1)配置 .qrc 文件 新建mypicture.qrc文件,记事本打…

【刷题宝典NO.0】

目录 素数的判定 打印素数 打印水仙花数 百钱买百坤 输出闰年 逆序打印一个整数的每一位 输出乘法口诀表 数字9出现的次数 二进制1的个数 输出一个整数的偶数位和奇数位的二进制序列 求两个整数的最大公约数 求两个整数的最小公倍数 小乐乐与欧几里得 小…

C#,数值计算——积分方程与逆理论Quad_matrix的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Quad_matrix : UniVarRealMultiValueFun { private int n { get; set; } private double x { get; set; } public Quad_matrix(double[,] a) { this.n a…

适用于 Linux 的 WPF:Avalonia

许多年前,在 WPF 成为“Windows Presentation Foundation”并将 XAML 作为 .NET、Windows 等的 UI 标记语言引入之前,有一个代号为“Avalon”的项目。Avalon 是 WPF 的代号。XAML 现在无处不在,XAML 标准是一个词汇规范。 Avalonia 是一个开…

精品Python空巢老人志愿服务平台慈善捐赠活动报名

《[含文档PPT源码等]精品基于Python的空巢老人志愿服务平台》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: 开发语言:python 使用框架:Django 前端技术&#…

EasyExcel复杂表头数据导入

目录 表头示例导入代码数据导出 表头示例 导入代码 Overridepublic void importExcel(InputStream inputStream) {ItemExcelListener itemExcelListener new ItemExcelListener();EasyExcel.read(inputStream, ImportItem.class, itemExcelListener).headRowNumber(2).sheet()…

【蓝桥每日一题]-二分类型(保姆级教程 篇2) #砍树 #木材加工

今天讲二分的例题,一道是“砍树”,一道是“木材加工” 目录 题目:砍树 思路1: 思路2: 题目:木材加工 思路: 题目:砍树 思路1: 二分查找:对高度进行二分 二…

关注云栖大会的感受:从工业大脑到全面AI时代的进化

前言 自2009年的地方网站峰会到如今的云栖大会,这个盛大的科技盛事已经走过了一个多十年的漫长历程。这个会议见证了中国科技行业的崛起,也记录了技术的不断演化。而对我来说,首次接触云栖大会是在2020年,当年大会迁移到线上&…

从零开发基于ASM字节码的Java代码混淆插件XHood

项目背景 因在公司负责基础框架的开发设计,所以针对框架源代码的保护工作比较重视,之前也加入了一系列保护措施 例如自定义classloader加密保护,授权license保护等,但都是防君子不防小人,安全等级还比较低 经过调研…

【密评】商用密码应用安全性评估从业人员考核题库(十七)

商用密码应用安全性评估从业人员考核题库(十七) 国密局给的参考题库5000道只是基础题,后续更新完5000还会继续更其他高质量题库,持续学习,共同进步。 4001 多项选择题 网络和通信安全层面的通信主体一般包括哪些&…

基于Docker-consul容器服务更新与发现

目录 一、什么是服务注册与发现: 二、Docker-consul介绍: 三、consul的关键特性: 四、consul部署: 1.部署规划: 2.consul服务器部署: 2.1 建立consul服务: 启动consul后默认会监听5个端口&a…

管理双因素身份验证的Web应用2FAuth

什么是 2FAuth ? 2FAuth 是一种基于 Web 的自托管替代方案,可替代 Google Authenticator 等一次性密码 (OTP) 生成器,专为移动设备和桌面设备设计。 近年来,双因素身份验证变得非常流行,2FA 现在是不可避免且至关重要的…

阿里云ECS经济型e实例ecs.e-c1m1.large性能测评

阿里云服务器ECS经济型e实例2核2G配置规格ecs.e-c1m1.large,CPU采用Intel Xeon Platinum架构处理器,e系列云服务器是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器。目前云服…

C++ 类型

4.5//默认double类型 4.5f//float类型 基本内置类型 基本内置类型包含算术类型和空类型,算术类型包含字符、整数型、布尔值和浮点数,空类型不对应具体的值,仅用于一些特殊的场合。 算术类型 分为两类,整型(包括字…