前言

最近fork了一个Github上的项目,本来是一个很简单的东西,但是原作者在历史的版本中上传了一部分二进制程序,每次上源程序更新的时候都会更新这个二进制文件.不过在某一个版本中作者将这个文件改成从github上获取最新的发布版本来解决了这个问题.但是在git的历史还存在这些文件,并且将代码库撑的非常大.

Git瘦身

查找占用空间大的文件

# 找出最大的3个文件的hash值
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -3

46f8fca81bcbeaefe7f8304fbab6f502af446029 blob   685732 313217 737403
dd2fb58717cdb0a0456a93d1cdbe07026c522d64 blob   3265150 387272 29009
3c05cbd4b5e5698ac6dff6d36d80ed3930885b1c blob   5052524 1542353 1063439

# 通过hash值确认文件名
git rev-list --objects --all | grep 3c05cbd4b5e5698ac6dff6d36d80ed3930885b1c
3c05cbd4b5e5698ac6dff6d36d80ed3930885b1c xxxx/xxx/xxxx.dat

在历史版本中删除二进制文件

# 删除文件
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch ****/xxx.dat' --prune-empty --tag-name-filter cat --all

# 更新索引,并做压缩对象
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

# 强制提交至远程代码库
git push origin --force --all

注意:这个操作十分危险,一旦提交在该文件将在所有提交历史中删除,回滚代码时将永远无法正确获取该文件,上述操作仅用于垃圾文件的整理

成果

通过删除历史版本的二进制文件,成功将原来70多M的代码库缩小到了1M以内(PS:本来就是一个小项目).

Q.E.D.


ねだるな、勝ち取れ、さすれば与えれねん