0%

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