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

目录

    • 一、问题背景
    • 二、问题复现
      • 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.rhkb.cn/news/181205.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3款免费又好用的 Docker 可视化管理工具

前言 Docker提供了命令行工具(Docker CLI)来管理Docker容器、镜像、网络和数据卷等Docker组件。我们也可以使用可视化管理工具来更方便地查看和管理Docker容器、镜像、网络和数据卷等Docker组件。今天我们来介绍3款免费且好用的 Docker 可视化管理工具。…

构建mono-repo风格的脚手架库

前段时间阅读了 https://juejin.cn/post/7260144602471776311#heading-25 这篇文章;本文做一个梳理和笔记; 主要聚焦的知识点如下: 如何搭建脚手架工程如何开发调试如何处理命令行参数如何实现用户交互如何拷贝文件夹或文件如何动态生成文件…

贰[2],OpenCV函数解析

1,imread:图片读取 CV_EXPORTS_W Mat imread( const String& filename, int flags IMREAD_COLOR );//参数1(filename):文件地址 //参数2(flags):读取标志 注:ImreadModes,参数2(flags)枚举定义 enum ImreadModes { IMREAD…

分享68个工作总结PPT,总有一款适合您

分享68个工作总结PPT,总有一款适合您 PPT下载链接:https://pan.baidu.com/s/1juus0gmesBFxJ-5KZgSMdQ?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易。知识付…

【Unity】2D角色跳跃控制器

最近加了学校的Nova独游社,本文是社团出的二面题,后续有时间优化下可能会做成一个二维冒险小游戏。本文主要涉及相关代码,参考教程:《勇士传说》横版动作类游戏开发教程 效果演示 【Unity】2D角色跳跃模拟器 主要实现功能&#xf…

AI:53-基于机器学习的字母识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

前端框架Vue学习 ——(二)Vue常用指令

文章目录 常用指令 常用指令 指令: HTML 标签上带有 “v-” 前缀的特殊属性&#xff0c;不同指令具有不同含义。例如: v-if, v-for… 常用指令&#xff1a; v-bind&#xff1a;为 HTML 标签绑定属性值&#xff0c;如设置 href&#xff0c;css 样式等 <a v-bind:href"…

【四、http】go的http的文件下载

一、日常下载图片到本地 //下载文件func downloadfile(url, filename string) {r, err : http.Get(url)if err ! nil {fmt.Println("err", err.Error())}defer r.Body.Close()f, err : os.Create(filename)if err ! nil {fmt.Println("err", err.Error())…

【深度学习】pytorch——实现CIFAR-10数据集的分类

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 往期文章&#xff1a; 【深度学习】pytorch——快速入门 CIFAR-10分类 CIFAR-10简介CIFAR-10数据集分类实现步骤一、数据加载及预处理实现数据加载及预处理归一化的理解访问数据集Dataset对象Dataloader对象 二、…

Linux的指令和用途(持续更新)

1. 基本指令&#xff1a; 概念介绍&#xff1a; 1. 目录&#x1f7f0;文件夹 Linux指令示范用法说明whowho查看哪些人登陆我的机器whoami (who am i)who am i查看当前账号是谁 pwd pwd查看当前我所在的目录clearclear 清屏 tree 目录名&#xff08;文件夹名&#xff09;tree g…

【JAVA学习笔记】59 - JUnit框架使用、本章作业

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter15/src/com/yinhai/homework JUnit测试框架 1.基本介绍 1. JUnit是一个Java语言的单元测试框架 2.多数Java的开发环境都已经集成了JUnit作为单元测试的工具 2.如何使用 创建方法后&#x…

2022年ISSCC会议报告分析

Tutorial Fundamentals of Self-Sensing Processor Systems AMD Zen架构的CCD die中有很多传感器检测die的频率、电压、电压和温度 HBM DRAM and 3D Stacked Memory Advances in Digital vs. Analog AI Accelerators Nvidia的Multi-chip架构的DNN加速器 Form1: Compute-in…

流媒体服务实现H5实时预览视频

目录 背景方案业务实践细节注意 待办 背景 客户aws服务磁盘存储告急&#xff0c;最高可扩容16T。排查如下&#xff1a;主要是视频文件存在大量复制使用的情况。例如发布节目时复制、预览时复制&#xff0c;这样上传一份视频后最大会有四份拷贝&#xff08;预览、普通发布、互动…

【m98】abseil-cpp的cmake构建

m79的代码有些头文件没有,比如#include "absl/numeric/bits.h"使用m98版本里的代码,支持cmake构建cmake版本 WIN32 DEBUG configure Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.22621. The CXX compiler identification is MSVC 19.37.32…

python调用飞书机器人发送文件

当前飞书webhook机器人还不支持发送文件类型的群消息&#xff0c;可以申请创建一个机器人应用来实现群发送文件消息。 创建机器人后&#xff0c;需要开通一系列权限&#xff0c;然后发布。由管理员审核通过后&#xff0c;才可使用。 包括如下的权限&#xff0c;可以获取群的c…

【Python从入门到进阶】41、有关requests代理的使用

接上篇《40、requests的基本使用》 上一篇我们介绍了requests库的基本使用&#xff0c;本篇我们来学习requests的代理。 一、引言 在网络爬虫和数据抓取的过程中&#xff0c;我们经常需要发送HTTP请求来获取网页内容或与远程服务器进行通信。然而&#xff0c;在某些情况下&…

Excel自学三部曲_Part3:Excel工作场景实战(四)

文章目录 四、高级函数与数据连接1. 多窗口操作2. VLOOKUP函数3. XLOOKUP函数4. CSV数据格式 四、高级函数与数据连接 1. 多窗口操作 如何将两张子表数据&#xff08;战区信息、城市信息&#xff09;连接到主表数据&#xff08;成交数据&#xff09;&#xff0c;增加主要数据的…

input 调起键盘 ,键盘距离输入框底部太近

input 调起键盘 &#xff0c;键盘距离输入框底部太近 解决方法 cursorSpacing‘20’ 单位是 ‘px’ <input cursorSpacing20 type"text" v-model"replyMain" />距离底部距离 20px &#xff0c;输入框距离键盘距离是20px

黑猫带你学NandFlash第3篇:NAND寻址(行列地址和block/page/LUN之间的关系)

本文依据不同型号NandFlash spec及个人工作经验整理而成,如有错误请留言。 文章为付费内容,已加入原创侵权保护,禁止私自转载及抄袭。 文章所在专栏:《黑猫带你学:NandFlash详解》 本文大约2000字,主要讲解:nand flash如何物理寻址、多plane又是如何寻址、相关计算公式等…

【免费生产力工具】CodeGeeX: AI代码自动补齐、对话、自动注释

CodeGeeX - A Multilingual Code Generation Tool - CodeGeeX 这个是官网&#xff0c;工程好像是开源的&#xff0c;生态不错。清华校友确实强&#xff0c;我是菜菜。 我是在vscode里面装的插件&#xff0c;直接搜索就行。 多的就不bb了&#xff0c;大家试试吧&#xff0c;确…