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

遇到 Git 提示大文件无法上传确实让人头疼

遇到 Git 提示大文件无法上传确实让人头疼,但别担心,我们可以一步步来解决。为了让你更清晰地了解整个流程,我先用一个表格来概括主要步骤:

步骤核心操作关键命令/工具示例 (用于删除历史中的大文件)
1. 定位大文件使用 Git 命令或工具找出仓库中的大文件git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
2. 删除大文件所有历史记录中彻底删除找到的大文件git filter-repo --path <文件路径> --invert-paths
BFG 工具
3. 清理与推送执行垃圾回收并强制推送到远程仓库git gc --aggressive --prune=all , git push --force
4. 预防再次发生使用 .gitignore 和 Git LFS 避免类似问题git lfs track "*.psd"

接下来,我们详细看看每一步的具体操作。

📍 第一步:定位问题大文件

首先需要找出到底是哪个(些)文件体积过大。Gitee 的错误信息有时会直接给出文件名,如果没有,你可以通过以下命令来查找:

  1. 查看体积最大的几个文件:这个命令会列出仓库中体积最大的5个文件(你可以修改 tail -5 中的数字来查看更多):
    git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
    
  2. 使用图形化工具(可选):如果你更喜欢图形界面,一些 Git 客户端(如 GitKrakenSourceTree)或者 Git LFS 的相关命令(git lfs ls-files)也能帮助你直观地查看大文件。

🗑️ 第二步:从历史中彻底删除大文件

找到大文件后,就需要将它从 Git 的历史记录中彻底移除请注意,以下操作会重写 Git 历史,这意味着会改变提交的哈希值。如果仓库是多人协作,必须提前通知所有协作者,让他们在你强制推送后重新克隆仓库

这里推荐使用 git filter-repo,它是一个更现代、更高效且更安全的工具,可以替代老旧的 git filter-branch

  1. 安装 git-filter-repo

    • Ubuntu/Debian: sudo apt install git-filter-repo
    • macOS: brew install git-filter-repo
    • 也可以通过 Pip 安装: pip install git-filter-repo
  2. 使用 git-filter-repo 删除文件(以删除 src/assets/大文件/mtbg.gif 为例):

    # 确保你在仓库的根目录下
    # --path 指定要删除的文件路径
    # --invert-paths 意味着排除这些路径,即删除它们
    git filter-repo --path src/assets/大文件/mtbg.gif --invert-paths --force
    

    这条命令会遍历所有提交,并将指定的文件从历史中彻底剔除。

  3. 替代方案:使用 BFG Repo-Cleaner
    BFG 是一个专为清理 Git 仓库中大文件而设计的工具,比 filter-branch 更快速简单。

    # 安装 BFG 需要 Java 环境
    # 下载 BFG jar 包(例如 wget 方式)
    wget http://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar
    # 运行 BFG 删除特定文件
    java -jar bfg-1.14.0.jar --delete-files 'mtbg.gif'
    

🧹 第三步:清理本地仓库并强制推送

彻底删除大文件后,本地仓库还需要进行一些清理操作,然后再推送到远程。

  1. 执行垃圾回收 (GC):这个命令会清理不必要的文件并优化本地仓库。

    git gc --aggressive --prune=all
    

    之后你可以用 git count-objects -vH 查看优化后的仓库大小,应该会显著减小。

  2. 强制推送到远程仓库:因为重写了历史,必须使用 --force 选项来推送。

    # 强制推送所有分支
    git push origin --force --all
    # 强制推送所有标签
    git push origin --force --tags
    

    再次强调:强制推送前务必确保团队其他成员知晓!

🛡️ 第四步:预防问题再次发生

为了避免以后再次遇到同样的问题,最好采取一些预防措施:

  1. 善用 .gitignore 文件:在仓库根目录创建或编辑 .gitignore 文件,忽略那些不需要版本控制的文件,如编译产物、依赖包、日志文件、系统文件等。例如:

    # 忽略 .zip 压缩包
    *.zip
    # 忽略 node_modules 目录
    node_modules/
    # 忽略 .log 日志文件
    *.log
    

    记得将 .gitignore 文件也提交到 Git 中。

  2. 使用 Git LFS 管理必需的大文件:如果你的项目中确实需要版本控制一些大型文件(如图片、视频、模型文件等),Git Large File Storage (LFS) 是一个更好的选择。它会将大文件存储在单独的地方,而在 Git 仓库中只保留指针,从而避免仓库体积过快增长。

    # 安装 Git LFS
    git lfs install
    # 跟踪特定类型的文件(例如跟踪所有 .psd 文件)
    git lfs track "*.psd"
    # 确保 .gitattributes 文件被提交(此文件保存 LFS 跟踪规则)
    git add .gitattributes
    git commit -m "开始使用 Git LFS 跟踪 .psd 文件"
    

⚠️ 操作前的重要提醒

在进行上述操作,尤其是重写历史(git filter-repoBFG)和强制推送(git push --force)前,请务必注意:

  • 备份你的仓库:最简单的方法就是直接复制整个仓库文件夹。
  • 通知协作者:重写历史后,其他所有开发者必须使用 git clone 重新克隆仓库,或者使用 git fetch origin && git reset --hard origin/master 等命令将其本地分支重置到新的历史记录上。否则,他们的提交极有可能引起混乱。

💎 总结

处理 Git 中的大文件问题,关键在于彻底将其从历史记录中移除,而不仅仅是删除最新版本的文件。git filter-repoBFG 工具是完成这项工作的利器。之后,通过配置 .gitignoreGit LFS,可以有效地预防此类问题再次发生。

希望这些详细的步骤能帮助你顺利解决问题。如果还有其他疑问,欢迎随时提出。


文章转载自:

http://VatlltHe.pLzgt.cn
http://cTnyCnAx.pLzgt.cn
http://JOjl0LKi.pLzgt.cn
http://mSfjXmBs.pLzgt.cn
http://LD1Mt0SR.pLzgt.cn
http://3XT4unLh.pLzgt.cn
http://w8hXaHkv.pLzgt.cn
http://iceo1Yzh.pLzgt.cn
http://jOLGt9Aw.pLzgt.cn
http://NCW0S1UY.pLzgt.cn
http://PFs62hZi.pLzgt.cn
http://60omAIDs.pLzgt.cn
http://cTQHLaQq.pLzgt.cn
http://phJRDdkG.pLzgt.cn
http://Dw0JCNxg.pLzgt.cn
http://1HD6uWC9.pLzgt.cn
http://t1gNLvwb.pLzgt.cn
http://RJNbnIvq.pLzgt.cn
http://1Ec26fqG.pLzgt.cn
http://xg2O6pRl.pLzgt.cn
http://eRNX5elw.pLzgt.cn
http://TGFlt4cM.pLzgt.cn
http://SDnXtJZS.pLzgt.cn
http://yrCOyrYk.pLzgt.cn
http://Ups2AnCK.pLzgt.cn
http://MUSUTiml.pLzgt.cn
http://Une2hvaL.pLzgt.cn
http://XE1XMayw.pLzgt.cn
http://LQSfIu8a.pLzgt.cn
http://kWUddMN4.pLzgt.cn
http://www.dtcms.com/a/368811.html

相关文章:

  • 基于单片机雏鸡家禽孵化系统/孵化环境监测设计
  • Docling将pdf转markdown以及与AI生态集成
  • GD32入门到实战35--485实现OTA
  • 别再看人形机器人了!真正干活的机器人还有这些!
  • C++编程——异步处理、事件驱动编程和策略模式
  • 【分享】AgileTC测试用例管理平台使用分享
  • cargs: 一个轻量级跨平台命令行参数解析库
  • 高级 ACL 有多强?一个规则搞定 “IP + 端口 + 协议” 三重过滤
  • 人大金仓:创建数据库分区
  • 【大数据专栏】大数据框架-Apache Druid Overview
  • Java中的多态有什么用?
  • 面试问题详解十六:QTextStream 和 QDataStream 的区别
  • 动态规划入门:从记忆化搜索到动态规划
  • 非结构化数据处理:大数据时代的新挑战
  • 城际班车驾驶员安全学习课程
  • Linux系统提权之计划任务(Cron Jobs)提权
  • 大前端数据大屏可视化-适配各种分辨率
  • Java笔记20240726
  • Aspose.Words for .NET 25.7:支持自建大语言模型(LLM),实现更安全灵活的AI文档处理功能
  • 怎样利用AE统计数据优化安防芯片ISP的图像质量?
  • 基于Python读取多个excel竖向拼接为一个excel
  • 深入解析汇编语言的奥秘
  • C++语言程序设计——06 字符串
  • 十二、软件系统分析与设计
  • flink 伪代码
  • AGENTS.md: AI编码代理的开放标准
  • 代码可读性的详细入门
  • 单元测试:Jest 与 Electron 的结合
  • 02-Media-5-mp4demuxer.py 从MP4文件中提取视频和音频流的示例
  • K8s访问控制(一)