Git 删除大文件的方法

有些时候不小心上传了一些敏感文件(例如密码), 或者不想上传的文件(没及时或忘了加到.gitignore里的),

而且上传的文件又特别大的时候, 这将导致别人clone你的代码或下载zip包的时候也必须更新或下载这些无用的文件,

因此, 我们需要一个方法, 永久的删除这些文件(包括该文件的历史记录).

首先, 可以参考 github 的帮助:

https://help.github.com/articles/remove-sensitive-data

步骤一: 从你的资料库中清除文件

以Windows下为例(Linux类似), 打开项目的Git Bash,使用命令:

$ git filter-branch --force --index-filter ‘git rm --cached --ignore-unmatch path-to-your-remove-file‘ --prune-empty --tag-name-filter cat -- --all

其中, path-to-your-remove-file 就是你要删除的文件的相对路径(相对于git仓库的跟目录), 替换成你要删除的文件即可. 注意一点,这里的文件或文件夹,都不能以 ‘/‘ 开头,否则文件或文件夹会被认为是从 git 的安装目录开始。

如果你要删除的目标不是文件,而是文件夹,那么请在 `git rm --cached‘ 命令后面添加 -r 命令,表示递归的删除(子)文件夹和文件夹下的文件,类似于 `rm -rf` 命令。

此外,如果你要删除的文件很多, 可以写进一个.sh文件批量执行, 如果文件或路径里有中文, 由于MinGW或CygWin对中文路径设置比较麻烦, 你可以使用通配符*号, 例如: sound/music_*.mp3, 这样就把sound目录下以music_开头的mp3文件都删除了.

例如这样, 新建一个 bash 脚本文件,del-music-mp3.sh:

#!/bin/bash

git filter-branch --force --index-filter ‘git rm --cached --ignore-unmatch projects/Moon.mp3‘ --prune-empty --tag-name-filter cat -- --all
git filter-branch --force --index-filter ‘git rm --cached --ignore-unmatch sound/Music_*.mp3‘ --prune-empty --tag-name-filter cat -- --all

如果你看到类似下面这样的, 就说明删除成功了:

Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (266/266)
# Ref ‘refs/heads/master‘ was rewritten

如果显示 xxxxx unchanged, 说明repo里没有找到该文件, 请检查路径和文件名是否正确.

注意: 补充一点, 如果你想以后也不会再上传这个文件或文件夹, 请把这个文件或文件夹添加到.gitignore文件里, 然后再push你的repo.

步骤二: 推送我们修改后的repo

以强制覆盖的方式推送你的repo, 命令如下:

$ git push origin master --force --all

这个过程其实是重新上传我们的repo, 比较耗时, 虽然跟删掉重新建一个repo有些类似, 但是好处是保留了原有的更新记录, 所以还是有些不同的. 如果你实在不在意这些更新记录, 也可以删掉重建, 两者也差不太多, 也许后者还更直观些.

执行结果类似下面:

Counting objects: 4669, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4352/4352), done.
Writing objects: 100% (4666/4666), 35.16 MiB | 51 KiB/s, done.
Total 4666 (delta 1361), reused 0 (delta 0)
To https://github.com/defunkt/github-gem.git
 + beb839d...81f21f3 master -> master (forced update)

为了能从打了 tag 的版本中也删除你所指定的文件或文件夹,您可以使用这样的命令来强制推送您的 Git tags:

$ git push origin master --force --tags

步骤三: 清理和回收空间

虽然上面我们已经删除了文件, 但是我们的repo里面仍然保留了这些objects, 等待垃圾回收(GC), 所以我们要用命令彻底清除它, 并收回空间.

命令如下:

$ rm -rf .git/refs/original/

$ git reflog expire --expire=now --all

$ git gc --prune=now
Counting objects: 2437, done.
# Delta compression using up to 4 threads.
# Compressing objects: 100% (1378/1378), done.
# Writing objects: 100% (2437/2437), done.
# Total 2437 (delta 1461), reused 1802 (delta 1048)
$ git gc --aggressive --prune=now
Counting objects: 2437, done.
# Delta compression using up to 4 threads.
# Compressing objects: 100% (2426/2426), done.
# Writing objects: 100% (2437/2437), done.
# Total 2437 (delta 1483), reused 0 (delta 0)

注: 绿色字部分是命令执行后的结果.

现在你再看看你的.git目录文件大小是不是变小了.

参考自:

http://whoop.sinaapp.com/blog/article/21

http://blog.csdn.net/meteor1113/article/details/4407209

原文:https://blog.csdn.net/taoyafan/article/details/86716280

原文地址:https://www.cnblogs.com/bigmango/p/11361344.html

时间: 2024-08-08 06:08:40

Git 删除大文件的方法的相关文章

centos下删除大文件

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

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

写在前面大家一定遇到过在使用Git时,不小心将一个很大的文件添加到库中,即使删除,记录中还是保存了这个文件.以后不管是拷贝,还是push/pull都比较麻烦.今天在上传工程到github上,发现最大只能上传100MB大小文件,在本地git库中有一个150MB文件,虽然已经删除,但还保存了记录.下面教大家如何从库中彻底删除无效大文件. 删除大文件方法很简单,就是先找到大文件对象再删除. 先提交所有更改 $ git commit -am "commit all"1对仓库进行gc操作 $ g

Linux培训教程 linux系统下分割大文件的方法

在linux中分割大文件,比如一个5gb日志文件,需要把它分成多个小文件,分割后以利于普通的文本编辑器读取. 有时,需要传输20gb的大文件,Linux培训 教程件到另一台服务器,也需要把它分割成多个文件,这样便于传输数据. 以下通过五个不同的例子,来讲解Linux下分割大文件的方法,供大家参考. 例1.以每个文件1000行分割 split命令分割文件成每个文件1000行,并且文件名依次为 [前缀]aa,[前缀]ab, [前缀]ac等,默认的前缀是X,每个文件的行数为1000行. 命令: 复制代

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

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

无法删除DLL文件解决方法(转)

无法删除DLL文件解决方法(转) 手动解决dll文件无法删除的终极方法 手动解决dll文件无法删除的终极方法 相信大家都遇见过:在删除一些软件的时候弹出某某文件正在运行或磁盘写保护不能删除这样的报错提示吧.而常常删除不掉的都一些后缀为.dll的文件.到底这个dll文件是什么文件,如何才能知道是哪些程序在调用这个dll文件呢? [基础理论]dll文件英文名称为Dynamic Linking Library,以下简称dll,中文名字"动态链接程序库"文件.在Windows中,许多应用程序并

运用php上传大文件配置方法

网站建设:运用php上传大文件配置方法如下: 翻开php.ini, 1.第一找出 file uploads区域,有影响文件上传的以下几个参数: file_uploads = on ;能否准许经过http上传文件的开关.默许为on即是开 upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,假设没指定就会用系统默许的临时文件夹 upload_max_filesize = 8m ;望文生意,即准许上传文件大小的最大值.默许为2m 2.在resource limits区域,还有参数 ;

打开大文件的方法

打开大文件的方法: ** Linux* 传统方式: less, cat, tail, grep, sed, awk * 其他方式:1, Vim 的 LargeFile 插件耗物理内存,会一下子把整个文件都加载进内存. 2, glogg 日志资源管理器较快,花了大约 12 秒就打开了一个 1G 的日志文件.更轻量级,在加载完一个 1G 的日志文件后,它仅仅只使用了 83M 的物理内存. 在 Debian (Wheezy 版本或更高版本).Ubuntu 或 Linux Mint 系统中安装 glog

转(Response.WriteFile 无法下载大文件解决方法)

以前用Response.WriteFile(filename),但当遇到大文件时无法完整下载. 该方法最大的问题,它不是直接将数据抛到客户端,而是在服务器端(IIS)上缓存.当下载文件比较大时,服务器压力会很大,iis虽然支持2G大小的文件下载,但当文件上了很多M时,由于服务器以及网络等因素的影响,异常概率相当大.所以当需要下载大文件时就不能使用上面的方法了. 微软推荐以下方法代替之: ■将数据分成较小的部分,然后将其移动到输出流以供下载,从而获取这些数据. ■为用户提供用于下载文件的链接. ■

?快速删除大文件的前几行或后几行及快速获取大文件的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