转载自:http://blog.sina.com.cn/s/blog_5482b7410100n9qz.html
用git减肥效果显著。

从svn迁移到git的时候,就想把一些无用的垃圾删掉,其中大部分不是代码,而是当初塞进来的大文件,早就没有用了,不过一直在仓库的历史中。第一个办法就是抛弃部分历史,用git svn迁移的时候,可以指定起始revision,以前的就被“忘记”了。这只能解决一小部分问题,毕竟我们都不愿意抛弃历史。

然后就是Pro Git中介绍的一个办法可以移除对象,很是强大呀,init个小库试验一下,好用,但是放在正式环境中,却发现不灵了,这个问题折腾了我好久,办法显然是对的,但不知什么步骤有问题。
重新google吧,才在kerneltrap上找到正解,操作过程不太一样,但对我的代码库是生效的。步骤如下:

    git rm bigfile
    git commit -m 'rm bigfile'  #干掉大文件,通常是早就干掉了
    git gc --prune           #打包
    git count-objects -v     #看看大小
    rm .git/logs/ -fr        #去掉可能的引用?
    git filter-branch --index-filter 'git rm --cached --ignore-unmatch bigfile' #关键命令,从历史中去掉此文件,如果是文件夹就-r,
    git count-objects -v     #看看大小,应该还没变
    cd ..; git clone repo repo2  #重新clone一个
    git gc --prune            #重新整理
    git count-objects -v     #看看大小,终于好了
    谢谢观赏

这里只剩干货了,建议参阅Pro Git,能学到很多实用的命令。其实真正有用的是git filter-branch,但我照Pro Git的步骤,对bigfile的引用都没了,但文件就是一直在库里删不掉。只好重新clone来解决。
因为git filter-branch会重写commit SHA1,所以记得,这些操作在普生之前都要做好,否则所有的clone都要重新fetch。