参考链接:
- Github: Removing files from a repository’s history
- Github: Removing sensitive data from a repository
- Git-scm: git-filter-branch
- bfg-repo-cleaner: bfg-repo-cleaner
场景1:
最新的一个提交版本里面新增了敏感、较大、无意义的文件,需要进行清理。
1
2
3
4
5
6
7
8
9
10
11
1. 删除文件
$ git rm --cached ${文件绝对地址}
2. 增加到上述文件到 .gitignore
$ vim .gitignore
3. 修复最新提交版本
$ git commit --amend
4. 推送新版本到远端仓库
如果刚才版本已经推送到远端仓库:
$ git push -f
如果刚才版本只是在本地仓库:
$ git push
1 | 1. 删除文件 |
场景2:
历史版本里面存在敏感、较大、无意义的文件,需要进行清理。
使用 git filter-branch
git 原生提供的命令,如果没有的话,请先升级机器git版本。
- 原理:
扫描代码库所有版本
如果某个版本里面发现了指定的文件OR目录:
如果此版本包含要清理的文件OR目录 和 其它变更的话,对此版本进行删除指定文件OR目录(保留其它变更),并生成新的版本。同时后面的版本会变基到新版本。
如果此版本只包含要清理的文件OR目录变更的话,那么此版本会被清除。同时后面的版本会变基到上一个版本。
如果版本没有包含指定文件OR目录,那么继续遍历。 - PS:
- 如果代码库历史比较多 OR 涉及到指定文件OR目录的版本比较多,那么命令执行会比较慢。
- 一般会导致代码库版本树变化,对于涉及开发同学,建议开始前提交本地修改变更到远端仓库,完成后本机重新clone代码库进行开发。
- 一般都在本地仓库根目录执行
- 执行命令后历史版本里面已经清理了文件, 但是我们的本地仓库里面仍然保留了这些objects, 等待垃圾回收(GC), 如果想立即回收本地仓库空间可以执行 git gc –prune=now.
1 | 1. 执行命令 |
使用 bfg-repo-cleaner
Roberto Tyley使用Scala语言写了 bfg-repo-cleaner工具。
可以简单理解为一个轻量级的 git filter-branch。
使用比较简单,功能比较强大,只需要下载最新的jar包,然后执行👇命令:
1 | # 删除大于50M的文件 |
PS:
1. bfg-repo-cleaner 有个protect功能,默认HEAD是受保护的。
受保护的分支最新版本如果涉及需要清理文件,那么并不会成功。
–no-blob-protection 关闭protect功能
–protect-blobs-from ${分支1},${分支2} 增加受保护的分支
2. 建议在本地仓库根目录执行。
场景3:
查找代码库里面较大文件方法:
- 如果当前版本还存在的文件,可以直接du排序来识别;
- 如果当前版本不存在,但是历史中出现过的大文件,可以按照下面步骤来查询。
1 | 1. 显示比较大的pack |

1 | 2. 识别object,对输出的第三列信息即文件大小进行排序 |

1 | 3. 识别object对应的文件 |
