当前位置: 首页 > news >正文

git远程仓库限额的解决方法——大文件瘦身

Git作为世界上最优秀的分布式版本控制工具,也是优秀的文件管理工具,它赋予了项目成员对项目进行远程协同开发能力,因此受到越来越多的行业从业人员的喜爱。很多优秀的项目管理平台,比如国内的Gitee,国外的Github,也都是以Git为核心操作。但是有些用户,尤其是游戏行业以及媒体行业人员可能会遇到一个问题,那就是随着提交的文件越来越多,项目越来越大,Git的响应速度越来越慢,更烦人的是,在提交到远程仓库的最后一刻,系统可能会提示用户此次提交被拒绝,原因是提交的文件太大,触发平台额度限制(无论是哪个平台),相信很多人在这一刻是崩溃的。

那么该如何避免这种崩溃事件的发生呢?

下面就介绍今天的主角Git LFS(Git Large File Storage),即Git大文件存储技术。

在Git仓库中,对于非文本文件,如各种多媒体文件,软件制品文件,二进制文件等等,这些文件往往体积比较大,使用Git直接管理会导致仓库的体积迅速膨胀,进而导致Git的许多操作变慢,同时也影响仓库上传到远程端。

Git LFS相当于Git的一种插件式增强工具,简单讲,它是在Git仓库使用这些文件的 指针代替 实际文件,而把实际文件存储在远程端LFS服务器,同时在本地仓库中实时追踪这些文件的变动。

原理

根据 Git LFS 官方帮助文档描述:

Git LFS是基于Git的 .gitattributs 配置文件的特性,用 smudge过滤器基于 指针文件寻找大文件内容, 用 clean过滤器在对大文件改动时,创建指针文件的新版本。同时还用 pre-push钩子将大文件上传到Git LFS服务器, 即在 git-push时, 如果提交中包含被LFS跟踪的大文件,pre-push钩子会检测到,并执行上传Git LFS服务器的动作。

因此,如果一个仓库中包含LFS内容,但是在推送时不想推送这类文件,只要加上 --no-verify选项就行,即:

$ git push --no-verify

--no-verify选项告诉 git push完全跳过 pre-push钩子。

前面提到被LFS管理的文件,本地仓库中保存的内容实际上是指针文件,其格式类似于下面这样:

$ git show HEAD:2.svgversion https://git-lfs.github.com/spec/v1
oid sha256:158213f90f8b27012034c6f58db63e1861b12aa122d98910de311bf1cb1e50a0
size 14651
(END)

version表示LFS的版本

oid表示文件对象的唯一hash值

size表示文件的大小

使用场景

场景一:

有一天你在Gitee上寻找感兴趣的项目,很快你就找到一个有价值的游戏项目,并且决定马上fork并clone下来:

$ git clone git@gitee.com:hightest/lfs-demo.git my-project
Cloning into 'lfs-copy'...
Enter passphrase for key '/home/git/.ssh/id_ed25519':
remote: Enumerating objects: 24, done.
remote: Counting objects: 100% (24/24), done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 24 (delta 7), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (24/24), done.
Resolving deltas: 100% (7/7), done.
Enter passphrase for key '/home/git/.ssh/id_ed25519':
Updating files: 100% (9/9), done.
Enter passphrase for key '/home/git/.ssh/id_ed25519':
Filtering content: 100% (5/5), 1.51 MiB | 257.00 KiB/s, done.

你只是稍微修改了一个示例文件example.lfs,然后顺便git diff一下,看下修改变化:

$cd my-project
# edit example.lfs
$ git diff
diff --git a/example.lfs b/example.lfs
index 9550b5b..8bfca2b 100644
--- a/example.lfs
+++ b/example.lfs
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:fa3b58d0150ccbaed40ab94fd5574ae8225e83117c076b586ef08ff38be8d923
-size 69
+oid sha256:d8f84506d6b9e804852c3b15b921893606b4c2cbe388d1cc118bd42101eed2a8
+size 63
(END)

git diff显示的修改变动不是你期望的,为啥会出现这个差异呢?

如果你看过前面的原理部分,那你马上就能看明白,这是LFS指针文件的差异,这说明你下载的这个仓库是用了LFS来管理了文件。

此时仓库的实际存储的文件大小只有132 Bytes, 而它的实际大小是9.18 MiB, 大小相差几个数量级。

这样做的好处非常明显,对于很大的文件,可以只用很小的空间来管理它。

image.png


场景二:

作为一名游戏开发人员,你一直想设计开发一款好玩的游戏,场景一中使用的项目给了你灵感,你决定在这个基础上进行深度开发,你在这个仓库里面加入了很多图片文件,音效文件等游戏资源文件,开始每次git add/commit/push都很顺利,但有一次你把这些文件打包成 biger.zip,想一次推送到远程仓库,结果最后推送失败,系统提示如下:

$ git push origin masterEnter passphrase for key '/home/git/.ssh/id_ed25519':
Locking support detected on remote "origin". Consider enabling it with:$ git config lfs.https://gitee.com/hightest/lfs-demo.git/info/lfs.locksverify true
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 6 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 388.92 MiB | 928.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.1]
remote: error: File: bcd245bbd11e6b1d71b5d3073f57007c4c002c4a 388.97 MB, exceeds 300.00 MB.
remote: Use command below to see the filename:
remote: git rev-list --objects --all | grep bcd245bbd11e6b1d71b5d3073f57007c4c002c4a
remote: Please remove the file from history and try again. (https://gitee.com/help/articles/4232)
To gitee.com:hightest/lfs-demo.git! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'gitee.com:hightest/lfs-demo.git'

很明显,由于推送的单个文件太大,超过配额300 MB,所以推送被拒绝。

同时,也能明显感觉得到,Git的各种基本操作变得卡顿、延迟。

这个时候,根据场景一的启发,你想到可以使用Gtiee的LFS服务,将大文件使用LFS管理,而仓库只保存它的指针信息,就能避免此问题。

  • 使用LFS管理历史大文件:

如果一个仓库中原来已经提交了一些大文件,此时即使运行 git lfs track也不会有效的。

为了将仓库中现存的大文件应用到LFS,需要用 git lfs migrate导入到LFS中:

$ git lfs migrate import --include-ref=master --include="biger.zip"
migrate: override changes in your working copy?  All uncommitted changes will be lost! [y/N] y
migrate: changes in your working copy will be overridden ...
migrate: Sorting commits: ..., done.
migrate: Rewriting commits: 100% (11/11), done.master        f9be3c554e9010ea5e0e23a6a0c6e53dca6c23b0 -> 53d5e655fe7cfd985f75384b92ac5414ad2ff394
migrate: Updating refs: ..., done.
migrate: checkout: ..., done.

–include-ref 选项指定导入的分支

如果向应用到所有分支,则使用–everything选项

–include 选项指定要导入的文件。可以使用通配符,批量导入。

上述操作会改写提交历史,如果不想改写历史,则使用 --no-rewrite选项,并提供新的commit信息:

$ git lfs migrate import --no-rewrite -m "lfs import"

将本地历史提交中的文件纳入到LFS管理后,如果重改了历史,再次推送代码时,需要使用强制推送。

这里选择改变提交历史,所以还需要使用 --force强制推送:

$ git push origin master --forceEnter passphrase for key '/home/git/.ssh/id_ed25519':
Locking support detected on remote "origin". Consider enabling it with:$ git config lfs.https://gitee.com/hightest/lfs-demo.git/info/lfs.locksverify true
Uploading LFS objects: 100% (8/8), 419 MB | 0 B/s, done.
Enumerating objects: 38, done.
Counting objects: 100% (38/38), done.
Delta compression using up to 6 threads
Compressing objects: 100% (37/37), done.
Writing objects: 100% (38/38), 136.26 MiB | 943.00 KiB/s, done.
Total 38 (delta 12), reused 10 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.1]
To gitee.com:hightest/lfs-demo.git+ cefd169...53d5e65 master -> master (forced update)

至此,已经将历史提交中的大文件迁移到远程LFS服务器,本地Git仓库,只保留这个大文件的指针文件,所以推送也不会再触发额度限制。推送成功之后,远程仓库就与本地保存一致,如场景一中的图示,它只管理这个大文件的指针文件。

推送成功后在仓库管理页面可以看到:

image.png

这里显示的是LFS Server实际管理的文件的大小,而Git仓库管理的大小则为134 Bytes!

image.png


场景三:

作为Git重度使用者的你,日常工作中必须使用Git管理你的文件,但是经历过上面对历史提交重写,并上传LFS服务器的你,学会了一开始在仓库中配置LFS功能,保证每一次提交、推送都保持完美。

在一个新的项目中,在初始阶段,你已经配置好了LFS。此时有更大一个文件 biggerthanbigger.zip,大小是778M,远远超过单个文件大小限制。

  • 使用LFS管理新增大文件
$ cd new-project
$ git add biggerthanbigger.zip
$ git commit -m "add bigger than bigger zip file"

然后提交到远程仓库, 因为使用了LFS服务,如果不出意外,这次不会被拒绝。

$ git push origin master
Enter passphrase for key '/home/git/.ssh/id_ed25519':
Locking support detected on remote "origin". Consider enabling it with:$ git config lfs.https://gitee.com/hightest/new-project.git/info/lfs.locksverify true
Uploading LFS objects: 100% (3/3), 1.2 MB | 0 B/s, done.
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 6 threads
Compressing objects: 100% (10/10), done.
Writing objects: 100% (10/10), 1.56 KiB | 1.56 MiB/s, done.
Total 10 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.1]
To gitee.com:hightest/new-project.gitdfe8b09..5f03bab  master -> master

但实际上,意外是很可能发生的!

因为推送的文件过于大,很有可能因为超过LFS的配额而推送失败,虽然LFS是专门用来管理大文件的,但是也不能无限制存放大文件,毕竟这不是网盘。

相关文章:

git远程仓库限额的解决方法——大文件瘦身

Git作为世界上最优秀的分布式版本控制工具,也是优秀的文件管理工具,它赋予了项目成员对项目进行远程协同开发能力,因此受到越来越多的行业从业人员的喜爱。很多优秀的项目管理平台,比如国内的Gitee,国外的Github&#…...

碰撞检测技术在AI中的重要作用

引言: 随着人工智能技术的不断发展,AI已经渗透到我们生活的方方面面。在游戏、机器人、虚拟现实等领域中,碰撞检测技术扮演着至关重要的角色。本文将探讨碰撞检测技术在AI中的作用,以及如何利用这项技术来改善AI系统的性能和用户体…...

UE5 Cesium2 最新使用地理配准子关卡构造全球场景

参考官方最新教程:Building Global Scenes with Georeferenced Sublevels – Cesium 创建持久关卡(主关卡) 这里一般包含DynamicPawn、CesiumSunSky 和 Cesium World Terrain 全球场景通用的对象。子关卡的创立,官方教程分为了两…...

【Java数据结构】详解LinkedList与链表(二)

目录 1.❤️❤️前言~🥳🎉🎉🎉 2.反转一个单链表 3. 找到链表的中间节点 4.输入一个链表,输出该链表中倒数第k个结点。 5.合并两个有序链表 6.链表分割 7. 判定链表的回文结构 8.输入两个链表,找…...

【精读文献】J. Environ. Manage.|青藏高原生态恢复项目下植被覆盖动态及其对生态系统服务的约束效应

目录 文章简介 01 文章摘要 02 研究背景、目标及创新点 2.1 研究背景 2.2 研究现状 03 研究区域与数据集 3.1 研究区域 3.2 研究数据 04 研究方法 4.1 趋势分析 4.2 残差趋势分析 4.3 偏相关 4.4 生态系统服务评价 4.5 约束线的定义和提取 05 研究结果 5.1 植被…...

QT之常用控件

一个图形化界面当然需要有各种各样的控件,QT也不例外,在QT designer中就有提供各种各样的控件,用以开发图形化界面。 而想使用好一个QT控件,就需要了解这些控件。 QWidget 在QT中,所有控件都继承自 QWidget 类&…...

【嵌入式硬件】DRV8874电机驱动

目录 1 芯片介绍 1.1 特性简介 1.2 引脚配置 1.3 最佳运行条件 2 详细说明 2.1 PMODE配置控制模式 2.1.1 PH/EN 控制模式 2.1.2 PWM 控制模式 2.1.3 独立半桥控制模式 2.2 电流感测和调节 2.2.1 IPROPI电流感测 2.2.2 IMODE电流调节 3.应用 3.1设计要求 3.2 设计…...

考研数学:有些无穷小不能用等价无穷小的公式?

今天要给大家分享的笔记是:《有些无穷小虽然是无穷小,但却不能用无穷小的相关公式》:...

谷歌浏览器的平替,内置开挂神器,我已爱不释手!

油猴浏览器正式版是一款基于谷歌Chromium源码开发的浏览器,它集成了集成了强大的油猴扩展(Tampermonkey),使得用户可以轻松安装各种脚本,从而增强网页浏览体验。提供了一个更加个性化和高效的浏览体验。 油猴扩展&…...

UMLChina为什么叒要翻译《分析模式》?

UMLChina受机械工业出版社委托,重新翻译《分析模式》。 Martin Fowler的“Analysis Patterns,Reusable Object Models”,原书出版于1997年,至今为止未出第2版。 2004年,机械工业出版社出版该书中译本《分析模式》。 …...

npm install 安装很慢如何解决?

1. 使用淘宝镜像 淘宝提供了一个更快的 npm 镜像源,可以大大加快依赖包的下载速度。你可以通过以下命令来设置淘宝镜像: npm config set registry https://registry.npmmirror.com然后再次运行 npm install: npm install2. 使用 nrm 切换镜…...

哈夫曼树的构造,哈夫曼树的存在意义--求哈夫曼编码

一:哈夫曼树的构造 ①权值,带权路径长度。 ②一组确定权值的叶子节点可以构造多个不同的二叉树,但是带权路径长度min的是哈夫曼树 ③算法基本思想及其实操图片演示 注:存储结构和伪代码 1 初始化: 构造2n-1棵只有一个根节点的二叉树,parent=rchild=lchild=-1; 其中…...

一个全面了解Xilinx FPGA IP核的窗口:《Xilinx系列FPGA芯片IP核详解》(可下载)

随着摩尔定律的逐渐放缓,传统的芯片设计方法面临着越来越多的挑战。而FPGA以其并行处理能力和可编程性,为解决复杂问题提供了新的途径。它允许设计者在同一个芯片上实现多种不同的功能模块,极大地提高了资源的利用率和系统的综合性能。 FPGA…...

virtualbox识别windows上usb设备

当你插入 USB 时,你的宿主操作系统可以轻松访问它并使用其中的文件。如果需要VirtualBox 的虚拟机也能访问物理机的 USB设备,需要安装安装扩展包管理器。 第一步: 要安装 VirtualBox 扩展包,只需访问 VirtualBox 官方下载页面&a…...

LabVIEW步进电机的串口控制方法与实现

本文介绍了在LabVIEW环境中通过串口控制步进电机的方法,涵盖了基本的串口通信原理、硬件连接步骤、LabVIEW编程实现以及注意事项。通过这些方法,用户可以实现对步进电机的精确控制,适用于各种自动化和运动控制应用场景。 步进电机与串口通信…...

云计算-高级云资源配置(Advanced Cloud Provisioning)

向Bucket添加公共访问(Adding Public Access to Bucket) 在模块5中,我们已经看到如何使用CloudFormation创建和更新一个Bucket。现在我们将进一步更新该Bucket,添加公共访问权限。我们在模块5中使用的模板(third_templ…...

Nginx企业级负载均衡:技术详解系列(17)—— 长连接优化策略与下载服务器高效搭建

你好,我是赵兴晨,97年文科程序员。 今天咱们来聊聊Nginx的两个知识点:Nginx的长连接优化、如何将Nginx配置成下载服务器。 长连接配置详解 在Nginx的配置中,长连接是一个重要的性能优化手段。它允许一个TCP连接上发送多个请求和…...

LabVIEW如何确保步进电机的长期稳定运行

步进电机因其良好的定位精度和控制性,在自动化设备中得到了广泛应用。然而,长期稳定运行对于任何电机系统都是一个重要的挑战。LabVIEW作为一款强大的图形化编程语言,通过其灵活的控制算法和实时监控能力,为步进电机的稳定运行提供…...

vue2 bug 小白求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)

我的vue2项目出现了一个超级恶心的bug 具体流程: 页面a点击a标签->到页面b->页面b用户退出刷新页面->点击浏览器的返回按钮返回上一页 返回页面后页面没有刷新导致用户名还显示这 项目中没有用keep-alive缓存 也在设置了key 尝试了window.removeEventLi…...

上海云管平台怎么样?客服电话多少?

云计算已经成为了企业数字化转型的重要一部分,而在上海,云管平台发展更是大势所趋。这不不少小伙伴在问,上海云管平台怎么样?客服电话多少? 上海云管平台怎么样?客服电话多少? 【回答】&#…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来&#xf…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...