首页 > 其他分享 >Git使用:大体积的历史commit无法推送到远程仓库的解决方案

Git使用:大体积的历史commit无法推送到远程仓库的解决方案

时间:2024-04-10 19:24:26浏览次数:25  
标签:origin git -- Git commit 推送 pcap 分支

0 介绍

场景:把本地仓库全量推送到远程的空仓库,保留提交历史,所有分支,所有tag;

大部分代码托管服务都会有免费推送的限制(如gitlab,Free push limit | GitLabAccount and limit settings | GitLab),所以当提交中包含大于指定体积的commit时,会遇到如下的失败:

如上的失败,可以通过git 命令,批量改写提交历史来解决;

本文以在GitHub建立远程的空仓库为例,介绍本地仓库推送至远程仓库,保留提交历史,所有分支,所有tag,和批量改写提交历史的步骤,以解决『大体积的历史commit无法推送到远程仓库』的问题;

1 新建远程的空仓库

不要添加默认的README,仓库必须为空,否则会push失败;

2 改写本地仓库的远程目标仓库

cd <你的本地仓库路径>/
# 查看远程目标
git remote -v
# 删除远程目标
git remote rm origin
# 或者,你也可以更改原有的远程目标的名字
# git remote rename origin old-origin
git remote -v

# 添加1.1节中新建的远程仓库
git remote add origin git@github.com:<你的GitHub用户名>/<你的仓库名>.git
git remote -v

3 推送所有分支/tag到远程

# 推送所有分支到名为origin的远程目标
git push -u origin --all
# 和 git push --set-upstream origin --all 是一样的
​
# 推送所有tag到名为origin的远程目标
# !! 推送tags仍然失败了,推测是需要切到每一个tag,每一个tag都需要删除大文件的历史;考虑到全量tags的推送并不重要,作为后续的TODO;
git push -u origin --tags
​
# (可选的)你也可以,更改当前的分支名,并单独推送该分支到远程目标的某一分支
# 更改当前分支名为main
git branch -M main
# 把当前分支推送到远程的main分支
git push -u origin main

4 批量改写提交历史

在3节,git push -u origin --all 时,报错;

日志中提示,有提交大于了100MB的限制;

4.1 找到大体积的文件

find . -type f -exec du -h {} + | sort -h | tail -n20

示例输出:

uav@uav-G5-5500:/tmp/**$ find . -type f -exec du -h {} + | sort -h | tail -n20
...
93M ./tests/data/Tunnel.pcap
205M  ./tests/data/highway.pcap
256M  ./.git/objects/pack/pack-c3cfcbe650b543caf1143271c04fa51e377314b5.pack
1019M ./.git/objects/pack/pack-d77ef04279c83d523f00d9b0df8674cae91ae0a2.pack

推测大体积的提交历史大概率是包含了pcap文件;

4.2 删除提交历史中的大体积文件

# 查看本地分支列表;
git branch
# 逐个切换到每个分支,在每个分支都要执行更改提交历史的操作;
# !! 没有找到1次变更所有分支历史的方法,TODO;
git checkout master
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.pcap'
# ... 同样操作其他分支;

控制台的输出,如下:

# ...
Rewrite 431b95ba4b145f70bb13fb4d5dbc11854d4d1283 (799/808) (67 seconds passed, remaining 0 predicted)    rm 'tests/data/16_highway.pcap'
rm 'tests/data/Tunnel.pcap'
rm 'tests/data/64.pcap'
rm 'tests/data/128.pcap'
Rewrite e447e530142024c1048aa3b782e6645238422b76 (799/808) (67 seconds passed, remaining 0 predicted)    rm 'tests/data/16_highway.pcap'
rm 'tests/data/Tunnel.pcap'
rm 'tests/data/64.pcap'
rm 'tests/data/128.pcap'
​
# 提示,历史改写成功;
Ref 'refs/heads/master' was rewritten

需要注意的地方:

# 使用*.pcap进行匹配,如果使用.pcap,会匹配失败,显示分支未修改;
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch .pcap'
WARNING: git-filter-branch has a glut of gotchas generating mangled history
   rewrites.  Hit Ctrl-C before proceeding to abort, then use an
   alternative filtering tool such as 'git filter-repo'
   (https://github.com/newren/git-filter-repo/) instead.  See the
   filter-branch manual page for more details; to squelch this warning,
   set FILTER_BRANCH_SQUELCH_WARNING=1.
​
Proceeding with filter-branch...
​
Rewrite e447e530142024c1048aa3b782e6645238422b76 (802/808) (67 seconds passed, remaining 0 predicted)     
# 提示分支未修改;
WARNING: Ref 'refs/heads/master' is unchanged

4.3 再次推送

参考3节;

git push -u origin --all

5 使用LFS推送大文件

LFS(Large File Storage)通过把大文件存储放在Git仓库之外,并在Git仓库中保存文件的指针,从而实现对大文件的管理;

如果仍然有大文件的推送需求,可以使用LFS,TODO;

x 参考

一些常用的git命令:

Git命令作用备注
git config -l 列出当前git仓库或全局配置的所有配置项及其值; 仓库级别的配置项存储在仓库的.git/config文件中;全局级别的配置项存储在您用户目录下的.gitconfig文件中;
git pull github main 从名为github的远程仓库的main分支拉取最新的修改,并将其合并到当前所在的本地分支中; 如果存在冲突,需要手动解决冲突后再进行提交;
     

x.1 Git clone 所有分支、tag到本地,然后push到一个新的远程仓库_如何把tag连同主分支一起复制-CSD

x.2 Git 一次性 pull push 所有的分支_git 提交所有的分支-CSDN博客

x.3 Git lfs - “这超出了 GitHub 的文件大小限制 100.00 MB” - 代码日志

x.4 关于 Git 大文件上传这件小事 | 素履独行

x.5 git 撤销修改 - 温故纳新 - 博客园

x.6 彻底解决 git push --set-upstream origin 问题-CSDN博客

x.7 撤销修改 - 廖雪峰的官方网站

x.8 git配置user.name和user.email-CSDN博客

x.9 Free push limit | GitLab

x.10 Account and limit settings | GitLab

 

标签:origin,git,--,Git,commit,推送,pcap,分支
From: https://www.cnblogs.com/xiaochou/p/18127194

相关文章

  • GitHub问题解决新突破,复旦大学MAGIS框架大幅超越GPT-4
    获取本文论文,请关注公众号【AI论文解读】回复:&nbsp;论文解读引言:GitHub问题解决的挑战与LLMs的潜力在软件开发的演进过程中,解决GitHub仓库中出现的问题是一个复杂的挑战。这不仅涉及到新代码的加入,还要维护现有功能的稳定运行。大型语言模型(LLMs)在代码生成和理解方......
  • Error: error:0308010C:digital envelope routines::unsupported
    Error:error:0308010C:digitalenveloperoutines::unsupported 一、问题现象在使用npmrundev命令运行vue工程时,报错如下:“Error:error:0308010C:digitalenveloperoutines::unsupported” 二、解决方案除了降低Node版本的方式,还可以通过如下方式解决该问题......
  • 让 GitHub 仓库的代码占比统计中包含 Markdown 文件 开发 Git 命令行 个人知识管理 知
    tags:网站/GitHub开发/Git命令行/git个人知识管理/知识库知识领域/文档工程让GitHub仓库的代码占比统计中包含Markdown文件GitHub是一个基于web的版本控制和协作平台,主要用于存储、管理和分享开源代码和项目。它支持Git作为唯一的版本库格式,使得多个开发者可......
  • 解决idea中Terminal终端无法执行GIT命令+Terminal 中文乱码
    参考文档:https://blog.csdn.net/qq_44830363/article/details/107096825 在使用IDEA进行开发的时候,经常会用到Git进行代码管理,如果再开一个Docker窗口的话,窗口切换来切换去的很不方便为了简单方便,我们可以直接在IDEA中使用自带的Terminal,这样就可以达到在IDEA主界......
  • Win11安装Git
    目录[-]  1. Win11安装Git1.1. 1.官网下载:https://git-scm.com/download/win1.2. 2.安装1.官网下载:https://git-scm.com/download/win2.安装 路径:  安装选项,一般自带的默认就行,其他按需勾选  创建启动菜单夹,即开始时windows的应用目......
  • git reset 的三种模式
    –soft:这种模式下,gitreset会移动HEAD指针到指定的提交,但不会更改暂存区或工作目录中的文件。这意味着您之前提交的更改将会被“取消”,但是这些更改仍然保留在暂存区中,您可以重新提交它们。–mixed:这是默认的模式,如果不指定任何模式,gitreset将使用这个模式。在......
  • git commit --amend用法
    一、gitcommit--amend修改提交信息:您可以使用gitcommit--amend命令来修改最新提交的提交信息。执行该命令后,Git将会打开文本编辑器(通常是的默认文本编辑器),以便编辑提交信息。完成编辑后保存并关闭编辑器,提交信息就会被修改。#提交了一个提交,但提交信息有误gitco......
  • Git教程(通俗易懂版本)
    什么是Git?Git其实就是一个帮助我们管理文件的工具,尤其适合程序员用来管理他们的代码文件。我们写代码的时候,经常会修改、添加或者删除一些文件,Git就能帮我们把这些文件的每一次变化都记录下来。比如说,你写了一个程序,然后修改了一些功能,Git就能帮你记住这次修改。如果你后来发......
  • 基于Git的版本控制【开发实践】
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档基于Git的版本控制【系统学习】一、预备知识1.1版本控制系统1.11什么是版本控制系统1.12为什么需要版本控制系统1.13版本控制系统的分类1.2Git简介1.2.1Git的优缺点1.2.2Git,GitHup,Gitee,GitLab1.2.......
  • 完整教程--idea使用git进行项目管理
    第一部分: 安装1.下载地址: https://git-scm.com/download/win;如果速度慢,使用迅雷下载;2.点击安装,然后下一步,直到下面这个页面:建议:按照上面所示方式选中复选框;3 点击下一步,直到出现这个页面:建议:这个页面是选择git使用的命令行,建议使用第一个......