问题描述
|
我有一个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对巨大的二进制文件进行版本控制”。相反,您可能为文件提供了一个单独的(忽略)文件夹,并使用了一个单独的系统来对文件进行版本控制。