我有一个大的(~2GB)、旧的(15 年以上)git 存储库(这些年来已经从 CVS 转换为 SVN 再到 git)。我们正在将托管从本地更改为云,因此我想花时间清理存储库。我想删除不再属于历史记录的旧文件,以减少整体克隆大小/时间。
有数百个分支我不再关心了。我真的只对保留几个(~10)个分支感兴趣。
我尝试使用 --strip-blobs-bigger-than 1M --protect-blobs-from <my refs>
使用
BFG 存储库清理器。它似乎非常符合我的用例。我不想删除当前存在于所选分支的 HEAD 中的任何文件,无论其大小如何。但是,除了生成映射文件之外,它不能很好地处理更改的提交哈希值。
我还尝试过使用 --strip-blobs-bigger-than 1M
git filter-repo。这使用了替换引用,以便我可以通过旧的提交哈希进行引用,这非常重要。但是,它通过删除我不想删除的文件来破坏我当前分支中的内容。
看起来
git filter-repo
是我应该使用的工具,但是,我不想手动列出我想要删除的所有文件(或者相反,我想要保留的文件)。有更好的方法吗?
我最终使用了bfg-ish,它是基于 git-filter-repo 的 BFG Repo 清理器的重新实现。
它提供了我想要的 BFG Repo Cleaner 的 API,具有 git-filter-repo 的功能
我所要做的就是跑
$ git clone <my repo url> myrepo
$ git lfs fetch --all
$ cd myrepo
$ bfg-ish -p branch1 branch2 branch3 branch4 --strip-blobs-bigger-than 1M .
其中branchN是我实际想要保留的分支的名称。
此存储库还使用了 git-lfs,因此在弄乱所有引用之前拉出“所有”LFS 对象非常重要。然后我将生成的存储库推送到我的新位置。