我的编程空间,编程开发者的网络收藏夹
学习永远不晚

GIT仓库瘦身及GIT LFS迁移的方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

GIT仓库瘦身及GIT LFS迁移的方法是什么

这篇文章主要介绍“GIT仓库瘦身及GIT LFS迁移的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“GIT仓库瘦身及GIT LFS迁移的方法是什么”文章能帮助大家解决问题。

背景

之前一些git项目上 CI/CD,发现jenkins git clone失败,设置depth及clone时间之类的无果。只能考虑仓库瘦身之类的策略。发现仓库有不少的二进制文件,且这些二进制文件变更还挺频繁,这种操作会导致git仓库成倍增长极速膨胀,git本身只适合管理文本文件。

另外说一则有趣的往事,之前有个同事是图形编程,这个语言源码是图片形式的,而且一个文件又特别大,上git管理,小公司项目变更又频繁,导致没多久公司内部搭的git服务器硬盘居然就给他的几个git仓库给占满了。

GIT LFS (Large File Storage)

虽然git一直不适合管理二进制文件,不过现在 git 也好像默认提供了git lfs 这个专门用来管理大文件的插件。

基本原理简单来说就是使用类似一个文件指针(文本)代替实际的文件存储,git只存储文件指针的变更历史而不是整个二进制文件,并且在使用的时候,自动提供hook,方便在如clone、pull、reset等操作会自动去获取这些文件指针的源二进制文件,同样更新二进制文件commit的时候,git 会自动将源文件转成文件指针进git log,同时源文件上传lfs。所以在用户层面,GIT LFS的使用其实是无感的。

迁移

上面简单介绍了一下GIT LFS,接下来直接将如何迁移,至于为什么直接讲迁移而不是从0开始如何使用LFS。
是因为往往是git仓库用着用着发现,仓库好大、clone好慢,然后才是想着用LFS。

迁移需要我们有仓库的管理员权限,并且将保护分支之类取消保护;
具体LFS迁移主要分为以下几步。

迁移前最好做好备份,并且和团队同事沟通好,毕竟操作涉及-f高危操作,容易背锅。

GIT LFS 服务端配置

部分自建git 服务的话,可能需要服务端配置开启LFS,比如gitlab。

GIT LFS 客户端安装

windows 的git安装包自带了该插件,不需要另外安装,其他平台可自行安装,链接。

在命令行尝试以下命令。

git lfs

如果有类似help文档信息输出,就是已经有git lfs客户端了。

git-lfs/2.11.0 (GitHub; windows amd64; go 1.14.2; git 48b28d97)git lfs <command> [<args>]Git LFS is a system for managing and versioning large files inassociation with a Git repository.  Instead of storing the large fileswithin the Git repository as blobs, Git LFS stores special "pointerfiles" in the repository, while storing the actual file contents on aGit LFS server.  The contents of the large file are downloadedautomatically when needed, for example when a Git branch containingthe large file is checked out.Git LFS works by using a "smudge" filter to look up the large filecontents based on the pointer file, and a "clean" filter to create anew version of the pointer file when the large file's contents change.It also uses a pre-push hook to upload the large file contents tothe Git LFS server whenever a commit containing a new large fileversion is about to be pushed to the corresponding Git server.

而后需要执行以下命令配置LFS全局环境,只需要配置一次,同时也会去更新当前仓库的hooks

git lfs install

迁移本地历史仓库

lfs迁移基本思想:lfs重写本地历史—>force push覆写远端,达到迁移的效果。
所以我们最好将本地仓库与远端同步,并且将所有的远端分支都创建本地分支;
而后cd到自己本地仓库,执行以下下命令,–include里面是glob表达式,自行添加想LFS管理的文件名,–everything代表所有本地分支

git lfs migrate import --include="*.bin,*.lib,*.so,*.dll,*.a,*.param,*.zip,*.gz" --everything
migrate: Sorting commits: ..., done.migrate: Rewriting commits: 100% (193/193), done.  develop                       bacb490a80ea46d73bd3866c2e7cf7ad199ce5eb -> 72884bcb4629417bad73ea3d485d08a0708909cd  feature/npu-platform          a3645632756becc527c7f4d58514b3c479f824d3 -> e227900a3903b3a6955e4dffee48daeceac6cdff  master                        1ccdecdcb4b5d6224a6e24c6f87793bfcc15ee4c -> 1d9fc2139600ef3d92a20d65bb5db89021b8c488  0.1.0                         07c6b2aa732506f1cc88cedb551f37f376b6efa6 -> 8e55193221dfca9f6bb28ccd9cca85af9c5958c9  1.0.0                         0f694efcd7aa9df641836e1ea6eebbb730b940b5 -> 3f9e77575120b6e56b34790c998a362116da75f5migrate: Updating refs: ..., done.

重写完本地分支、tag之类的,

我们在这里可以先执行 git lfs ls-files查看有哪些文件被转成了lfs管理,检查是否有遗漏

这个时候无论在哪个分支,都会出现 .gitattributes 文件,且都会被添加上类似以下内容。

*.bin filter=lfs diff=lfs merge=lfs -text*.lib filter=lfs diff=lfs merge=lfs -text*.so filter=lfs diff=lfs merge=lfs -text*.dll filter=lfs diff=lfs merge=lfs -text*.a filter=lfs diff=lfs merge=lfs -text*.param filter=lfs diff=lfs merge=lfs -text*.zip filter=lfs diff=lfs merge=lfs -text*.gz filter=lfs diff=lfs merge=lfs -text

同时可以看到我们二进制文件全部都转成了以下形式文本

version https://git-lfs.github.com/spec/v1oid sha256:9171c8350d72ccca6ad60ac80b577157ad1f9fd44ca05744216e02ccbfcdf491size 10260

确认无误,之后就可以推送到远端;
由于lfs的迁移会重写所有的commit,并且修改hash值,因此需要我们需要加上–froce
这步需要取消保护分支(保护分支无法-f)

git push --force --all

这样远程仓库的lfs迁移就完成了

迁移一些补充说明

  1. 迁移者的本地仓库lfs文件转源文件:经过以上步骤,由于我们将所有文件都已经转成文件指针,我们需要将文件下载回来才能正常使用该仓库。
    需要注意,其他人重新clone 或者同步 lfs迁移过的remote仓库 是不需要该步,只针对迁移作者本地的仓库。

git lfs pull
  1. 团队中其他成员迁移前的本地仓库同步: 由于远程仓库的历史已经被全部重写,所以无法直接同步,最好是删除本地分支,重新拉取远程分支,如果本地已经有部分commit需要提交,可以重名本地分支,拉取远程再做cherry pick。git tag 同理,删除迁移前的tag。

  2. 本地仓库清理:上面的迁移成功将二进制文件迁移成git lfs 对象,git log 也不在存储源文件文件变更而是指针变更,但是在本地.git文件夹中仍存在之前不再需要的git log 缓存,执行以下命令做清理。

git reflog expire --expire-unreachable=now --allgit gc --prune=now

清理前后仓库对比

lfs直观来讲更多的是针对仓库大clone慢的问题,我这边lfs迁移前后各备份各一个小型远程仓库做测试,
用的测试仓库二进制文件比较小,总大50m内,且变更次数也在个位数。
clone下来的仓库大小对比。
和我预估差不多,总的来说更适合二进制文件频繁变更,如果单纯是文件大,但文件不变更的话,在clone的时候区别不大,毕竟lfs在clone仍有下载源文件的步骤,除开下载,操作文件指针对git来说理论仍会有性能提升,但是可能感知不强。

关于“GIT仓库瘦身及GIT LFS迁移的方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

GIT仓库瘦身及GIT LFS迁移的方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

GIT仓库瘦身及GIT LFS迁移的方法是什么

这篇文章主要介绍“GIT仓库瘦身及GIT LFS迁移的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“GIT仓库瘦身及GIT LFS迁移的方法是什么”文章能帮助大家解决问题。背景之前一些gi
2023-06-26

git创建本地仓库的方法是什么

要创建一个本地仓库,可以按照以下步骤使用Git命令行工具:打开命令行终端(Command Prompt,Terminal等)。使用cd命令切换到要创建仓库的目录。例如,cd Documents/将切换到"Documents"目录。使用g
2023-10-20

git-github子模块仓库更新及git中submodule子模块的添加、使用和删除方法是什么

这篇文章主要介绍“git-github子模块仓库更新及git中submodule子模块的添加、使用和删除方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“git-github子模块仓库更新及g
2023-07-05

oracle数据库迁移的方法是什么

Oracle数据库迁移的方法有以下几种:1. 物理迁移:将源数据库的数据文件、控制文件、重做日志文件等物理文件直接复制到目标数据库。这种方法适合整个数据库的迁移,速度较快,但需要停机时间。2. 逻辑迁移:通过将源数据库的逻辑结构和数据导出为
2023-08-21

mysql数据库迁移的方法是什么

这篇文章主要介绍了mysql数据库迁移的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql数据库迁移的方法是什么文章都会有所收获,下面我们一起来看看吧。简介数据迁移(data migration
2023-02-15

postgresql数据库迁移的方法是什么

PostgreSQL数据库迁移的方法有多种,以下是其中一些常用的方法:使用pg_dump和pg_restore命令:这是最常用的方法之一,通过使用pg_dump命令将源数据库导出为一个SQL文件,然后使用pg_restore命令将SQL文件
postgresql数据库迁移的方法是什么
2024-04-17

DB2中数据库迁移的方法是什么

在DB2中,数据库迁移的方法可以有多种,具体根据迁移的需求和条件来选择合适的方法,常见的方法包括:使用DB2提供的工具:DB2提供了多种用于数据库迁移的工具,如DB2MOVE、db2look、db2look、db2relocatedb等,可
DB2中数据库迁移的方法是什么
2024-03-07

mongodb整个数据库迁移的方法是什么

迁移MongoDB数据库有多种方法可供选择,以下是一种常见的方法:备份原始数据库:使用mongodump命令导出原始数据库的数据和配置信息,生成一个备份文件。例如,可以执行以下命令备份数据库:mongodump --db
mongodb整个数据库迁移的方法是什么
2024-04-09

MongoDB数据库快速迁移的方法是什么

要在MongoDB数据库之间进行快速迁移,可以采用以下方法之一:1. 备份和恢复:使用mongodump命令将原始数据库备份到一个文件,然后使用mongorestore命令将备份的数据库恢复到新的数据库中。这种方法适用于小型数据库和较短的迁
2023-08-30

oracle数据库表空间迁移的方法是什么

Oracle数据库表空间迁移有多种方法,以下是几种常见的方法:1. 使用Oracle Data Pump工具:Oracle Data Pump是Oracle数据库的一个强大工具,可以用于将表空间中的数据迁移到其他数据库。使用Data Pum
2023-09-15

重置本地git存储库的方法是什么

要重置本地git存储库,可以使用以下命令:重置所有更改并清除暂存区域:git reset --hard HEAD重置所有更改但保留在暂存区域:git reset --hard HEAD^重置到特定的提交ID:git reset --hard
重置本地git存储库的方法是什么
2024-04-09

Laravel中数据库迁移的操作方法是什么

这篇文章主要介绍了Laravel中数据库迁移的操作方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Laravel中数据库迁移的操作方法是什么文章都会有所收获,下面我们一起来看看吧。一:创建迁移在lara
2023-07-05

git安装及环境变量配置的方法是什么

要安装git并配置环境变量,您可以按照以下步骤进行操作:步骤1:下载并安装Git访问Git官方网站:https://git-scm.com/downloads根据您的操作系统,选择适用于您的版本并下载安装程序。运行安装程序,并按照提示
2023-10-20

Git删除分支的命令及使用方法是什么

本篇内容主要讲解“Git删除分支的命令及使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Git删除分支的命令及使用方法是什么”吧!一、Git分支简介在Git中,分支是独立于主分支的代
2023-07-05

gitlab迁移数据后此项目仓库不存在原因和解决方法是什么

这篇文章主要介绍“gitlab迁移数据后此项目仓库不存在原因和解决方法是什么”,在日常操作中,相信很多人在gitlab迁移数据后此项目仓库不存在原因和解决方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
2023-07-05

Oracle数据库升级或数据迁移的方法是什么

本篇文章给大家分享的是有关Oracle数据库升级或数据迁移的方法是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。这里论述了oracle数据库升级的升级前的准备、升级过程和升
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录