Git - 删除无用的文件历史记录

这几个晚上在倒腾 CDOJ 的 git repository,在家试着 git clone 了一把,第一感觉是

1
坑爹啊,这是什么鬼,为什么会有100多MB的history。

国内的情况你们懂的,花了 10 来分钟才把 repo 下下来,想了下原因,大致上是:昀大爷年轻的时候把 MathJaxFont 之类的前端 module 给 push 上去了,还不时地移了几次位置,更新了几次版本,就这样把几百 MB 的东西加到历史里去了。。。

那么问题来了,怎么要才能把这些 “没有必要存在” 的文件从 git history 里面给干掉呢?这里推荐一个相对简单的办法(更简单的办法是用 bfg ,然而家里的网络直接装都装不上,我放弃了)。

想起来你要删的文件是什么

在这里我们用 MathJax.zip 做例子。

用 git filter-branch 去看下有多少 commits 和你选择的文件相关。

1
$ git log --stat | grep -B 10 -A 10 MathJax\\.zip

在这里, grep 的 A 和 B 参数表示的是 after 和 before,这样可以大致上看到一个 commit 的 context。

把你所不关心的文件从历史记录中删掉

1
2
3
$ git filter-branch --force --index-filter \
'git rm --cache --ignore-unmatch MathJax.zip' \
--prune-empty --tag-name-filter cat -- --all

清理下你的本地 git repo

1
2
3
$ git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
$ git reflog expire --expire=now --all
$ git gc --prune=now --aggressive

强制刷新 remote repo 的内容

1
2
$ git push origin --force --all
$ git push origin --force --tags