Yhzhtk's Blog

(热爱技术,高效Code)     归档  标签  源码  关于 


Git 完全删除某个文件,不在任何版本保留 (转)

2013-06-06    git  删除 


从git中永久删除文件以节省空间

在使用版本管理工具的过程中我们会碰到这样的问题:不小心把一个不该加入版本管理的文件加进去了,有时候这个文件很大,也许我们整个版本库才几百 K,但加进去这个没用的文件却有好几百M,我可不想因为这么个破烂东西把整个版本库整个硕大无比,以后维护备份都不方便;还有时候是不小心把一个敏感文件 加进去了,比如里面写了信用卡密码的文本文件。

这时候我们希望能把它从版本库中永久删除不留痕迹,不仅要让它在版本历史里看不出来,还要把它占用的空间也释放出来。

在svn中的办法是把整个版本库dump出来filter一下再load回去。git中可以用下面的方法来实现:

我们先创建一个试验用的版本库,并往里面提交一个10M的大文件再删除:


$ mkdir t  
$ cd t  
$ git init  
Initialized empty Git repository in  
 /Users/apple/t/.git/  
$ dd if=/dev/urandom of=testme.txt bs=10240 count=1024  
1024+0 records in  
1024+0 records out  
10485760 bytes transferred in 1.684808 secs (6223712 bytes/sec)  
$ git add testme.txt  
$ git commit -m "a"  
[master (root-commit)]: created 6fbb432: "a"  
 1 files changed, 0 insertions(+), 0 deletions(-)  
 create mode 100644 testme.txt  
$ git rm testme.txt  
rm 'testme.txt'  
$ git commit -m r  
[master]: created bb38396: "r"  
 1 files changed, 0 insertions(+), 0 deletions(-)  
 delete mode 100644 testme.txt  

这时候我们看看版本库的大小:


$ du -hs  
 10M    . 

很明显虽然testme.txt已经被删除了,但是因为版本历史里曾经有过这个文件,所以git仍然把它存在库中,以后可以通过它再把它恢复回来。

但我实在是不希望这么一个空版本库占用我10M宝贵的硬盘空间,所以我要把它全删掉,这就要用到git的filter-branch命令了。具体这个命令的用法可以看文档,下面是这个例子中的用法:


$ git filter-branch --tree-filter 'rm -f testme.txt' HEAD  
Rewrite bb383961a2d13e12d92be5f5e5d37491a90dee66 (2/2)  
Ref 'refs/heads/master'  
 was rewritten  
$ git ls-remote .  
230b8d53e2a6d5669165eed55579b64dccd78d11        HEAD  
230b8d53e2a6d5669165eed55579b64dccd78d11        refs/heads/master  
bb383961a2d13e12d92be5f5e5d37491a90dee66        refs/original/refs/heads/master  
$ git update-ref -d refs/original/refs/heads/master [bb383961a2d13e12d92be5f5e5d37491a90dee66]  
$ git ls-remote .  
230b8d53e2a6d5669165eed55579b64dccd78d11        HEAD  
230b8d53e2a6d5669165eed55579b64dccd78d11        refs/heads/master  
$ rm -rf .git/logs  
$ git reflog --all  
$ git prune  
$ git gc  
$ du -hs  
 84K    .  

OK,这个文件已经完完全全删掉了,版本库已经不再占用空间了。

 

以上转自 http://blog.csdn.net/meteor1113/article/details/4407209


 

git 强制删除错误上传的文件

今天新开了一个git的版本库用来存放对应的一个Qt项目.但是在第一次提交的时候出现了问题.把在不同平台编译的预编译文件都传上去了…

窘阿.每次编译都提示文件所需求的不存在或者不对…唉~把解决方案放在这吧~也段是学习git的一个笔记.

$ git filter-branch --tree-filter 'rm -f moc_* and *.o and ui_*' HEAD		
Rewrite e64c4ea53de2c6eaabf5fdb1082e247c1661f359 (17/26)Warning:		
commit message does not conform to UTF-8.		
You may want to amend it after fixing the message, or set the config		
variable i18n.commitencoding to the encoding your project uses.			
Rewrite f5b19c2172a923b89ee009f44bb2ee00d60f4808 (26/26)			
Ref 'refs/heads/master' was rewritten		
$ git update-ref -d refs/original/refs/heads/master		
  f5b19c2172a923b89ee009f44bb2ee00d60f4808		
$ rm -rf .git/logs		
$ git reflog --all	
$ git prune
$ git gc

中间出现的一个warn是指在不同平台的提交的log信息编码不同,这个可以参照之前写的一篇文章来解决,不过不解决也不会影响什么就是了.

以上转自 http://blog.zzjin.net/git-强制删除错误上传的文件/





Load Disqus comments, wait a moment..

分类标签

jekyll3   编码1   windows1   bootstrap1   git3   删除1   命令3   python11   ide1   学习笔记3   实例分析1   mp3-tag1   github1   gravatar1   goagent1   翻墙1   C#4   找茬工具1   微博自动评论1   电脑监控1   备份1   云搜索1   wxPython1   py2exe1   yaml1   Eric1   PyQt1   Django1   设计模式5   翻译4   单例1   工厂1   抽象工厂1   生成器1   原型1   适配器1   桥接1   组合1   装饰1   外观1   享元1   代理1   MVC1   观察者1   状态1   策略1   模板1   访问者1   职责链1   解释器1   迭代器1   中介者1   备忘录1   js1   resize bar1   geohash1   口琴1   rpm安装gitlab1   CentOs1   WordPress1   数据库1   读脏数据1   丢失的修改1   不可重复读1   幻影读1   1   隔离1   思维导图1   事务1   笔记迁移1   note1   issue1  

最新博文

最新评论

Feed订阅


©2013 首页   关于     View me on GitHub Powered by Jekyll & Bootstrap 知识共享许可协议