Git从库中移除已删除大文件

写在前面
大家一定遇到过在使用Git时,不小心将一个很大的文件添加到库中,即使删除,记录中还是保存了这个文件。以后不管是拷贝,还是push/pull都比较麻烦。今天在上传工程到github上,发现最大只能上传100MB大小文件,在本地git库中有一个150MB文件,虽然已经删除,但还保存了记录。下面教大家如何从库中彻底删除无效大文件。

删除大文件
方法很简单,就是先找到大文件对象再删除。

先提交所有更改

$ git commit -am "commit all"
1
对仓库进行gc操作

$ git gc
1
运行count-objects 查看空间使用,size-pack 是以千字节为单位表示的 packfiles 的大小,因此已经使用了大约150MB 。

$ git count-objects -v
1

运行底层命令 git verify-pack 以识别出大对象,对输出的第三列信息即文件大小进行排序.

$ git verify-pack -v .git/objects/pack/pack-8eaeb...9e.idx | sort -k 3 -n | tail -3
1

注:可以看到对底下那个就是大文件。

使用 rev-list 命令,传入 - -objects 选项,它会列出所有 commit SHA 值,blob SHA 值及相应的文件路径,这样查看 blob 的文件名。

$ git rev-list --objects --all | grep 185ab8d
1

将该文件从历史记录的所有 tree 中移除。

$ git log --pretty=oneline --branches -- spark-assembly-1.3.1-hadoop2.4.0.jar
1

用 filter-branch 命令重写从 646784 开始的所有 commit 才能将文件从 Git 历史中完全移除。

git filter-branch --index-filter ‘git rm --cached --ignore-unmatch spark-assembly-1.3.1-hadoop2.4.0.jar‘ -- 646784d95f347749517a67c50c117f4bf85d0b42..
1

注:- -index-filter 选项类似于 - -tree-filter 选项,但这里不是传入一个命令去修改磁盘上签出的文件,而是修改暂存区域或索引。不能用 rm file 命令来删除一个特定文件,而是必须用git rm - -cached 来删除它 ── 即从索引而不是磁盘删除它。这样做是出于速度考虑 ── 由于 Git 在运行你的 filter 之前无需将所有版本签出到磁盘上,这个操作会快得多。也可以用 - -tree-filter 来完成相同的操作。git rm 的 - -ignore-unmatch 选项指定当你试图删除的内容并不存在时不显示错误。最后,因为你清楚问题是从哪个 commit 开始的,使用 filter-branch 重写自 64678 这个 commit 开始的所有历史记录。不这么做的话会重写所有历史记录,花费不必要的更多时间。

现在历史记录中已经不包含对那个文件的引用了。不过 reflog 以及运行 filter-branch 时 Git 往.git/refs/original 添加的一些 refs 中仍有对它的引用,因此需要将这些引用删除并对仓库进行 repack 操作。在进行 repack 前需要将所有对这些 commits 的引用去除。

\$ rm -Rf .git/refs/original
\$ rm -Rf .git/logs/
\$ git gc
1
2
3
查看空间使用

$ git count-objects -v
1
如果真的要完全把这个对象删除,可以运行 git prune 命令。
---------------------
作者:白 杨
来源:CSDN
原文:https://blog.csdn.net/zcf1002797280/article/details/50723783
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/liangqihui/p/9880916.html

时间: 2024-07-29 20:07:56

Git从库中移除已删除大文件的相关文章

Foremost恢复Linux中已删除的文件

Foremost 我们只能在Linux中恢复已删除的文件,只要这些扇区在硬盘上没有被覆盖. 首先安装 要在CentOS上安装Foremost,我们将从官方网页下载并安装最前面的rpm.打开终端并执行以下命令 $ sudo yum install https://forensics.cert.org/centos/cert/7/x86_64//foremost-1.5.7-13.1.el7.x86_64.rpm -y 使用Ubuntu,最重要的包可以使用默认存储库.要在Ubuntu上安装最重要的,

myeclipse如何恢复已删除的文件和代码

这是一篇分享技巧的文章:myeclipse恢复误删文件和代码 [ 恢复误删文件 ] 今天在写代码的时候,不小心把一个包给删除了,然后这个包下所有的文件都没了,相信很多人都有类似的经历, 幸好myeclipse给我们提供了一个很好用的功能: 选中项目 -> Restore from Local History.. -> 界面如下图 勾选要恢复的文件,点击Restore就可以了,就算你把myeclipse关闭了也没关系,非常的方便. [ 恢复误删代码 ] 对于误删的代码,如果没有关闭myeclip

linux删除大文件后空间没释放的问题

问题描述: 磁盘100%,删除大文件后,df -h发现磁盘空间未释放 解决办法: 该问题是因为在Linux系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用. #lsof  |grep deleted #kill xxx     删除占用文件的进程 #df -h     再次查看磁盘空间

?快速删除大文件的前几行或后几行及快速获取大文件的n到m行数据

快速删除大文件的前几行或后几行 http://stackoverflow.com/questions/17330188/remove-first-n-lines-of-a-file-in-place-in-unix-command-line 快速获取大文件的n到m行数据 http://unix.stackexchange.com/questions/47407/cat-line-x-to-line-y-on-a-huge-file

centos下删除大文件

今天发现测试的服务器磁盘空间使用100%.通过df  -lh 和du –sh,定位到是jenkins日志文件363G.网上查找了几个关于删除大文件的方法: 一.最low的:rm rm 删除大文件后,df –lh查看会发现,磁盘还是被占用. 这是因为rm删除文件,文件一般不会立即写入磁盘,也就是空间不会立即释放. 解决的方式: 1.重启服务器(最好别选): 2.losf | grep deleted :查看被删除的进程 进程未关闭,所以磁盘空间不会被释放,需要kill –9 PID,杀死进程后,空

删除本地git版本库中受版本控制的文件

某些情况下,我们可能想得到一个干净的目录,比如说,我的源代码已经全部提交到服务器的版本库中了,本地的源代码我想删除掉,但是可能源码目录下有一些我们自己的配置.数据等文件,这些文件又不是受版本控制的,如果整个源码目录删除的话,这些文件也会一起删除了! 如果要本地硬盘中, 某个git源码目录下受版本控制(tracked files)的文件,留下未受版本控制的文件(untracker files),可以用以下指令: git ls-files | xargs rm 运行上述指令后,手动删除 .git 目

.git文件过大!删除大文件

在我们日常使用Git的时候,一般比较小的项目,我们可能不会注意到.git 这个文件. 其实, .git文件主要用来记录每次提交的变动,当我们的项目越来越大的时候,我们发现 .git文件越来越大. 很大的可能是因为提交了大文件,如果你提交了大文件,那么即使你在之后的版本中将其删除,但是, 实际上,记录中的大文件仍然存在. 为什么呢?仔细想一想,虽然你在后面的版本中删除了大文件,但是Git是有版本倒退功能的吧,那么如果大文件不记录下来, git拿什么来给你回退呢?但是,.git文件越来越大导致的问题

Git 删除大文件的方法

有些时候不小心上传了一些敏感文件(例如密码), 或者不想上传的文件(没及时或忘了加到.gitignore里的), 而且上传的文件又特别大的时候, 这将导致别人clone你的代码或下载zip包的时候也必须更新或下载这些无用的文件, 因此, 我们需要一个方法, 永久的删除这些文件(包括该文件的历史记录). 首先, 可以参考 github 的帮助: https://help.github.com/articles/remove-sensitive-data 步骤一: 从你的资料库中清除文件 以Wind

找回回收站已删除的文件

在平时,只要用过电脑的都知道回收站可以回收我们不要的垃圾,只要一键便可以轻而易举的删除,方便快捷.但你是否一两次不注意删除错文件,却不知如何去恢复它,所以在埋怨电脑公司为什么要设置个回收站呢?但你试过几天不用回收站的后果么? 还记得曾有一段时间我也信誓旦旦地说,再也不用回收站,总给我带来麻烦,害我总要重新下载或写,麻烦死了.但是没用回收站的那段日子好麻烦,垃圾堆满计算机,启动时好慢哦,最后不得不重新启用回收站.所以你们可别随意跟回收站赌气,不然吃亏的可是你. 还记得某次,我在网上接了个手打文章的