Git如何删除历史记录中的大文件详解

前言

Git 作为一个分布式的版本管理工具,代码仓库中是会保存所有历史记录的。虽然,Git 的 .gitignore 文件里可以定义一些忽略文件的规则,但是,在我们提交代码的过程中,总会不小心误提一些没用的文件,如果文件中存在大文件,就会导致:就算我们把它删了重新提交,.git 文件夹依然会占用较大的空间。

如何解决这个问题呢?其实,Git 已经为我们提供了解决方案,就是被称为核弹级的命令 filter-branch。这个命令可以用来修改历史提交记录,把不需要的文件永久地从历史记录中删除。

方法如下:

首先,我们需要找出大文件。

找出排名前 5 的 pack 记录:

git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5

可以看到这样的信息:

1753e0b6aa1cd3ed27d1d14e8e569664c685e896 blob 44600 43841 37970
ca12c545eae19d688ac840c7f0e2e623a1a4192b blob 45262 8534 140448
7a3265ee94c0ab25cf079ac8ccdf87f41d455d42 blob 54708 49093 171307
72590cee1315e32dada25535184dcee97c6f5af9 blob 1114323 1104823 113887612
4cc1f9dcef1004355d2a595d45808e99f100dc4d blob 114592569 113703558 184054

最后一条就是最大的一条记录,4cc1f9dcef1004355d2a595d45808e99f100dc4d 是它的 id。
找出该记录对应的文件:

git rev-list --objects --all | grep 4cc1f9dcef1004355d2a595d45808e99f100dc4d

可以看到:

4cc1f9dcef1004355d2a595d45808e99f100dc4d app/src/main/assets/Android群英传.pdf

这个文件就是罪魁祸首,它占了有 100 多 M 的空间。

将该文件从历史记录中移除:

git log --pretty=oneline --branches -- app/src/main/assets/Android群英传.pdf

重写所有 commit,将该文件从 Git 历史中完全移除:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch app/src/main/assets/Android群英传.pdf' -- --all

到这里,历史记录中已经没有该文件了。不过运行 filter-branch 产生的日志还是会对该文件有引用,所以还需要运行以下几条命令,把该文件的引用完全删除:

rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
git prune

这个时候,再看文件夹,已经小了很多了。然后就可以 push 代码了,不过就是需要强制 push:

git push --force

以上就是删除 Git 历史记录中大文件的过程。

当然 filter-branch 的作用还不止这些,比如它还可以用来修改历史提交记录中的用户名(username)和邮箱(email)等。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Git忽略提交的3种方法及Git忽略规则

    在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交. Git 忽略文件提交的方法 有三种方法可以实现忽略Git中不想提交的文件. 1.在Git项目中定义 .gitignore 文件 这种方式通过在项目的某个文件夹下定义 .gitignore 文件,在该文件中定义相应的忽略规则,来管理当前文件夹下的文件的Git提交行为. .gitignore 文件是可以提交到公有仓库中,这就为该项目下的所有开发者都共享一套

  • Git原理和常用操作

    由于gitlab的免费私有仓库的优势,所以在公司使用gitlab会多一些,对于gitlab来说,注册需要翻墙,而登录不需要. 关于git是做什么的,这里就不多说了.相信大家知道,这里就带大家,一小时掌握git原理,学会git操作. Git 工作流程 在gitlab上一般每个人或每个项目或者每个bug都会有自己独立的分支.分支不影响主分支master. 一般工作流程如下: 克隆 Git 资源作为工作目录. 在克隆的资源上添加或修改文件. 如果其他人修改了,你可以更新资源. 在提交前查看修改. 提交

  • 利用github搭建个人maven仓库的方法步骤

    缘起 之前看到有开源项目用了github来做maven仓库,寻思自己也做一个.研究了下,记录下. 简单来说,共有三步: deploy到本地目录 把本地目录提交到gtihub上 配置github地址为仓库地址 配置local file maven仓库 deploy到本地 maven可以通过http, ftp, ssh等deploy到远程服务器,也可以deploy到本地文件系统里. 例如把项目deploy到/home/hengyunabc/code/maven-repo/repository/目录下

  • Git和Maven的子模块简单实践

    当一个产品或者项目由大量独立模块组成时,想要从 Git 挨个下载下来导入 IDE 查看并不容易,此时可以结合使用 Git 和 Maven 的子模块来处理这种场景. 通过 Git 子模块可以自动批量下载所有关联的项目,通过 Maven 子模块可以批量导入到 IDE 中,结合这两者可以很容易的管理和查看项目. 创建子模块项目 打开 Git Bash,创建一个空目录并进入: $ mkdir erp-submodules $ cd erp-submodules/ 把当前目录初始化为 Git 仓库 $ g

  • Git设置和取消代理的方法

    参考: https://gist.github.com/laispace/666dd7b27e9116faece6 前提是你本地有 socks5 代理. 上面参考地址作者提供的配置无效,但是后面回复中的配置有效: git config --global http.proxy 'socks5://127.0.0.1:1080' git config --global https.proxy 'socks5://127.0.0.1:1080' 还有针对 github.com 的单独配置: #只对gi

  • 详解git仓库迁移的两种解决方案

    Git仓库迁移而不丢失log的方法 要求能保留原先的commit记录,应该如何迁移呢? 同时,本地已经clone了原仓库,要配置成新的仓库地址,该如何修改呢? 注意:如果使用了代码审核工具Gerrit,那么在进行操作之前需要将Gerrit关掉,等成功恢复后再将Gerrit开户即可 1.使用git push --mirror 先了解一些git的基本参数介绍 git clone --bare GIT-CLONE(1) Git Manual GIT-CLONE(1) NAME git-clone -

  • 详解使用mpvue开发github小程序总结

    前言 最近有点闲,想起关注已久的mpvue写小程序,所以稍微肝了半个多月写了个github版的微信小程序,已上线.现在总结一下遇到的坑. 扫码体验. 项目地址:https://github.com/cheesekun/wx-github mina坑 scroll-view 高度 可滚动视图区域. 使用竖向滚动时,需要给<scroll-view/>一个固定高度,通过 WXSS 设置 height. 小程序提供的scroll-view组件,想让他能滚动,就要给他提供一个固定的高度. 我们一般需求是

  • 微信小程序使用gitee进行版本管理

    摘要:小程序协助开发挺重要的,但是开发工具到现在开始才支持版本管理,也是良心功能啊.马上试试连上gitee,团体开发更方便. 准备:安装git.安装最新的微信小程序开发助手.注册gitee账号. 第一:打开对应的项目,开启版本管理 第二:初始化git版本库 点击确定,马上就开启了,很简单粗暴. 第三:配置个人的信息 设置网络验证,你可以选择对应的验证方式,用户名和密码比较简单点,直接使用gitee的账号密码就可以了.我是使用的指定密钥,为了方便 第四:在gitee创建新的项目 拷贝对应的ssh路

  • Docker-compose部署gitlab的方法步骤

    Docker-compose部署gitlab 1.安装Docker 安装必要工具 复制代码 代码如下: [root@vm_10_14_centos ~]# yum -y install yum-utils device-mapper-persistent-data lvm2 添加Docker-ce镜像源并安装 [root@vm_10_14_centos ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/li

  • VSCode配置Git的方法步骤随记

    vscode中对git进行了集成,很多操作只需点击就能操作,无需写一些git指令. 不过这就需要你对vscode进行配置.下面我会讲到git的配置与免密码上传github. 一.安装Git管理工具,可上官网安装,安装路径https://git-scm.com/,安装路径默认C:\Program Files\Git,可自行修改,这里我是安装在D:\Program Files\Git. 二.安装完Git之后,如图配置好环境变量path路径的信息,一般会自动配置成功,配置完成后电脑就可以使用Git了.

随机推荐