当前位置: 首页 > 编程笔记 >

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

鲁博瀚
2023-03-14
本文向大家介绍Git如何删除历史记录中的大文件详解,包括了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)等。

总结

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

 类似资料:
  • 我正在爱奥尼亚4中创建一个注销页面,我想要的是清除路由器历史记录,以便“后退”按钮不起作用,另外,我想知道在导航到登录屏幕或导航到登录页面之前,如何销毁注销页面。 我尝试运行构造函数中的代码以清除本地存储,第一次运行正常,但第二次没有运行该代码。据我了解,该页面已经加载,因此不会再次运行构造函数。我尝试将我的代码放在ngDoCheck()中,但它触发了多次,我不想要。 我想清除路由历史记录,以便在

  • 我试图使用以下答案中的说明从Jenkins中删除构建历史: 如何清除我的詹金斯/哈德逊建筑历史? 但是,我得到以下错误消息: groovy.lang.missingMethodException:方法的无签名:jenkins.branch.organizationfolder.getBuilds()适用于参数类型:()值:[]可能的解决方案:getViews()、doBuild(jenkins.u

  • 我是詹金斯的新用户。我最近遇到了一个失败的产品构建,在该构建中,我看到该特定产品的过去未跟踪的Maven模块被添加到当前要构建的现有Maven模块集中。

  • 读取播放历史信息 调用地址 http://api.bilibili.cn/history 返回 返回值字段 字段类型 字段说明 results int 返回的记录总数目 list object 返回数据 返回字段 “list” 子项 返回值字段 字段类型 字段说明 aid int 视频编号 typeid int 视频分类ID typename string 视频分类名称 title string

  • 历史记录 控制台维护 Elasticsearch 成功执行的最后500个请求列表。点击窗口右上角的时钟图标即可查看历史记录。这个图标会打开历史记录面板,您可以在其中查看历史请求。您也可以在这里选择一个请求,它将被添加到编辑器中当前光标所在的位置。 图 9. 历史记录面板

  • 3.3.1.1. 同步的文件历史记录 微力同步记录对文件的添加,修改、删除的操作记录,通过历史记录列表可查看时间时间及发生设备,如下: 事件时间,显示添加、修改、删除等操作发生的时间; 文件时间,显示该文件的最后修改时间; 操作类型,显示此次针对该文件所进行的操作的类型; 发生设备,显示进行此操作的设备名称; 目录,显示该文件所属同步目录; 清空历史记录,点击后可清除所有记录,此操作仅清除记录而已