如何从git存储库中删除旧版本的媒体文件

问题描述

| 我有一个Git存储库,其中包含几个巨大的媒体文件(图像和音频文件)。这些媒体文件的多个版本已被连续提交到仓库中。这些文件是相同资产的连续精炼版本,并且具有相同的名称。 我只想在Git存储库中保留最新版本,因为它太大了。 最简单的方法是什么? 如何将这些更改正确传播到上游存储库?     

解决方法

        我有一个脚本(此处为github要点),可从git repo的整个历史记录中删除一些不需要的文件夹,或删除除最新版本以外的所有文件夹。 很难假设所有git存储库都位于
~/repos
中,但这很容易更改。它也应该很容易适应于处理单个文件。     ,        旧线程,但万一有人跌跌撞撞在这里… GitHub和Bitbucket都建议使用BFG Repo-Cleaner。 看到: GitHub:删除敏感数据 Bitbucket:减少存储库大小并 Bitbucket:维护Git存储库 删除超过1 MB的文件以及不包含在HEAD中的jpg,png和mp3的示例:
# First get the latest bfg.jar,then:
$ git clone --mirror git://example.com/some-big-repo.git
$ java -jar bfg.jar --strip-blobs-bigger-than 1M --delete-files \'*.{jpg,png,mp3}\' some-big-repo.git
$ cd some-big-repo.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
$ git push
注意:现在您已经推送了更新的转速,远程存储库也应该运行它的
git gc
…否则您将看不到大小的减少。 (例如参见https://stackoverflow.com/a/28782154/3419541) 最后,重新克隆存储库,以确保您不会意外地重新提交旧的媒体文件Blob。     ,        检查ProGit书中“维护和数据恢复”一章中“删除对象”部分。它提供了有关如何从git repo中删除对象的步骤。但请注意,它具有破坏性。     ,        如前所述,您将在这里重写历史记录,因此您将需要合作者(如果有)来执行
git rebase
。 至于从历史记录中剥离特定文件,Github有一个很好的演练。 对于未来的解决方案,您应该查看将二进制文件放入子模块中。   Git \的子模块支持允许存储库包含外部项目的签出作为子目录。子模块保持自己的身份;子模块支持仅存储子模块存储库的位置和提交ID,因此其他克隆包含项目(\“ superproject \”)的开发人员可以轻松地克隆相同版本的所有子模块。可以对超级项目进行部分检出:您可以告诉Git不克隆任何,部分或全部子模块。 https://git-scm.com/docs/git-submodule https://git-scm.com/book/zh/v2/Git-Tools-Submodules     ,        据我所知,这是不可能完成的,因为在git中,每次提交都依赖于整个历史的内容。因此,摆脱旧的大文件的唯一方法是“重播”整个提交历史记录(最好是具有相同的提交时间戳和作者),而忽略大文件。请注意,这将产生完全独立的提交历史记录。 这显然不是一个非常可行的方法,因此该课程可能是“不要使用git对巨大的二进制文件进行版本控制”。相反,您可能为文件提供了一个单独的(忽略)文件夹,并使用了一个单独的系统来对文件进行版本控制。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...