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

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

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

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

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

 
  
[python:nogutter] view plain copy
  1. $ mkdir t  
  2. $ cd t  
  3. $ git init  
  4. Initialized empty Git repository in  
  5.  /Users/apple/t/.git/  
  6. $ dd if=/dev/urandom of=testme.txt bs=10240 count=1024  
  7. 1024+0 records in  
  8. 1024+0 records out  
  9. 10485760 bytes transferred in 1.684808 secs (6223712 bytes/sec)  
  10. $ git add testme.txt  
  11. $ git commit -m "a"  
  12. [master (root-commit)]: created 6fbb432"a"  
  13.  1 files changed, 0 insertions(+), 0 deletions(-)  
  14.  create mode 100644 testme.txt  
  15. $ git rm testme.txt  
  16. rm 'testme.txt'  
  17. $ git commit -m r  
  18. [master]: created bb38396: "r"  
  19.  1 files changed, 0 insertions(+), 0 deletions(-)  
  20.  delete mode 100644 testme.txt  
这时候我们看看版本库的大小:
 
  
[python:nogutter] view plain copy
  1. $ du -hs  
  2.  10M    .  
很明显虽然testme.txt已经被删除了,但是因为版本历史里曾经有过这个文件,所以git仍然把它存在库中,以后可以通过它再把它恢复回来。

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

 
  
[python:nogutter] view plain copy
  1. $ git filter-branch --tree-filter 'rm -f testme.txt' HEAD  
  2. Rewrite bb383961a2d13e12d92be5f5e5d37491a90dee66 (2/2)  
  3. Ref 'refs/heads/master'  
  4.  was rewritten  
  5. $ git ls-remote .  
  6. 230b8d53e2a6d5669165eed55579b64dccd78d11        HEAD  
  7. 230b8d53e2a6d5669165eed55579b64dccd78d11        refs/heads/master  
  8. bb383961a2d13e12d92be5f5e5d37491a90dee66        refs/original/refs/heads/master  
  9. $ git update-ref -d refs/original/refs/heads/master [bb383961a2d13e12d92be5f5e5d37491a90dee66]  
  10. $ git ls-remote .  
  11. 230b8d53e2a6d5669165eed55579b64dccd78d11        HEAD  
  12. 230b8d53e2a6d5669165eed55579b64dccd78d11        refs/heads/master  
  13. $ rm -rf .git/logs  
  14. $ git reflog --all  
  15. $ git prune  
  16. $ git gc  
  17. $ du -hs  
  18.  84K    .  

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


原文链接:http://blog.csdn.net/meteor1113/article/details/4407209

你可能感兴趣的:(从git中永久删除文件以节省空间)