BFG Repo-Cleaner 是一个用于清理 Git 仓库历史的强大工具,它是 git-filter-branch 的替代品,主要用于处理以下场景:
相比于 git-filter-branch,BFG 具有以下优势:
首先需要使用 --mirror
标志克隆一个仓库的完整副本:
git clone --mirror git://example.com/some-big-repo.git
注意:这会创建一个裸仓库,虽然看不到普通的文件,但包含了完整的 Git 数据库。建议在此时创建备份。
根据需求使用不同的命令清理仓库。以下是几个常用示例:
删除大文件:
java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
删除特定文件:
java -jar bfg.jar --delete-files id_{dsa,rsa} my-repo.git
替换敏感信息:
java -jar bfg.jar --replace-text passwords.txt my-repo.git
BFG 更新完提交后,需要使用 git gc 命令清理不需要的数据:
cd some-big-repo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
确认仓库状态无误后,推送更新到远程:
建议所有用户放弃旧的仓库副本,并克隆新的干净数据。最好删除所有旧副本,因为它们包含您不想冒险推回新清理仓库的脏历史记录。
删除所有大于 50MB 的文件:
bfg --strip-blobs-bigger-than 50M my-repo.git
删除所有名为 ‘id_rsa’ 或 ‘id_dsa’ 的文件:
bfg --delete-files id_{dsa,rsa} my-repo.git
使用文件列表替换所有密码:
bfg --replace-text passwords.txt my-repo.git
移除所有 .git 文件夹(从其他版本控制系统迁移时常用):
bfg --delete-folders .git --delete-files .git --no-blob-protection my-repo.git
BFG 比 git-filter-branch 快得多,主要归功于以下几个方面:
--no-blob-protection
标志关闭保护(不推荐)。BFG Repo-Cleaner 是一个高效、易用的 Git 仓库清理工具,特别适合处理大文件删除和敏感信息清理的场景。它的高性能和简单的命令使得维护 Git 仓库历史变得更加容易。在使用时要注意备份数据,并确保理解保护机制的作用,以避免意外损失重要信息。