16 May 2015

前言

在克隆https://github.com/numbbbbb/githuber.info之后,发现版本库无比巨大,是工作区文件的8倍,发issue,并寻找缩减版本库的方法时,看到git-diet。以下是一些探索。

git-diet

git-diet项目的本体就是封装了git操作的两个shell脚本: find_fattest_objects.shpurge_objects.sh

  • find_fattest_objects.sh - 查找版本库中巨大的对象, 其使用说明如下

    find_fattest_objects.sh [-n <number_of_objects>] [-d] [-f]
    
    OPTIONS
      -n  显示版本库中最大文件的数目(默认为 10)
      -d  过滤掉当前依然在项目中的文件
      -f  只显示文件名和路径 (在使用管道时,非常有用)
    
  • purge_objects.sh - 将这些对象从版本库中删除

    purge_objects.sh <file>...
    
    OPTIONS
      file  一个或多个需要删除的文件, 以空格分隔
    

使用实战

最优方法,使用管道,不过速度太慢

./find_fattest_objects.sh -n1000 -d -f | xargs purge_objects.sh   #项目库中的对象比较多时,执行比较慢。

顺带了解了一下 xargs 命令。

次有等方法,有些手动执行的辅助的shell脚本:

remove_file=(images/guzhang.d18d4737.gif node_modules/*.* bower_components/*.* bower_components/echarts/doc/**/*.* bower_components/echarts/doc/**/*.* bower_components/echarts/*.*  bower_components/echarts/doc/asset/img/*.* .tmp/**/*.* .tmp/*.* bower_components/echarts/doc/slide/img/*.* node_modules/grunt-contrib-imagemin/node_modules/imagemin/node_modules/imagemin-pngquant/node_modules/pngquant-bin/vendor/pngquant bower_components/echarts/doc/asset/img/example/*.* bower_components/echarts/build/source/*.*)

for i in ${remove_file[*]}; do 
  ./purge_objects.sh $i; 
done

shell的数组使用格式真奇葩。

最蠢方法 纯粹手动:

./find_fattest_objects.sh -n100

# 手动执行删除
./purge_objects.sh images/guzhang.d18d4737.gif
./purge_objects.sh node_modules/*.* bower_components/*.*
./purge_objects.sh node_modules/**/*.* bower_components/**/*.*
./purge_objects.sh bower_components/echarts/doc/**/*.*
./purge_objects.sh bower_components/echarts/*.*
./purge_objects.sh bower_components/echarts/doc/asset/img/*.*
./purge_objects.sh .tmp/**/*.* .tmp/*.*
./purge_objects.sh bower_components/echarts/doc/slide/img/*.* node_modules/grunt-contrib-imagemin/node_modules/imagemin/node_modules/imagemin-pngquant/node_modules/pngquant-bin/vendor/pngquant bower_components/echarts/doc/asset/img/example/*.* bower_components/echarts/build/source/*.*
# 以及其他的一些杂七杂八的东西

使用总结:

可以缩减版本库的大小。确实少了30mb,但是,只能缩减本地版本库大小,无法推送到远程已存在的库中。只能用来初始化提交时减少版本库的大小,不能用来减少已存在的库的大小。

后记

天下殊途而同归,一致而百虑。我就是从最蠢的方法开始操作的,所以我是二货。

参考文献

  1. HowTo Completely Remove a File From Git History



傲娇的使用Disqus