如何从历史记录中删除所有大于 1 Mb 的文件(但将它们保留在存储库中)

lok*_*oki 0 git github git-filter-branch git-commit git-rewrite-history

我有一个包含许多大文件(psd、exe、pdf 等)的存储库,每次我提交这些文件的更新时,git .pack 文件都会急剧增长以保留历史记录。如何从历史记录中删除所有大于 1mb 的文件,但将它们保留在存储库中。

另外,是否可以设置特定文件从不存储在历史记录中?

Kon*_*ner 6

使用 git-filter-repo

git filter-repogit 项目推荐git filter-branch

git filter-repo --strip-blobs-bigger-than 1M
Run Code Online (Sandbox Code Playgroud)

使用 BFG Repo-Cleaner

较旧的BFG Repo-Cleaner曾经是最流行的工具。

要删除所有大小 > 1 MB 的文件:

$ bfg --strip-blobs-bigger-than 1M  my-repo.git
Run Code Online (Sandbox Code Playgroud)

默认情况下,它不会触及您当前的文件。

不要使用 git 过滤分支

git filter-branch 有很多陷阱,可能会对预期的历史重写产生不明显的损坏(并且可能会让您几乎没有时间来调查此类问题,因为它的性能如此糟糕)。这些安全和性能问题无法向后兼容地修复,因此不建议使用它。 来源

第二个问题:如何防止特定文件被存储在历史记录中

您可以添加文件,.gitignore以便它们从一开始就不会被添加,但 Git 无法配置为自动删除它们,因此您需要某种自动执行bfg或 的挂钩git-filter-repo

最好首先预防问题

像这样的工具bfg适用于罕见的例外情况。理想情况下,您应该首先防止大型二进制文件包含在存储库中。相反,还有许多其他方法可以保留它们,例如将它们添加到 GitHub 版本或根据您的环境将它们上传到包存储库,例如 npm、Maven 存储库或GitHub 包