我有一个包含几个巨大媒体文件(图像和音频文件)的Git存储库。这些媒体文件的几个版本已连续提交给回购。这些文件是相同资产的连续精炼版本,它们具有相同的名称。
我想在Git存储库中只保留最新版本,因为它变得太大了
最简单的方法是什么?
如何将这些更改正确地传播到上游存储库?
答案 0 :(得分:14)
旧线程,但万一其他人偶然发现...
GitHub& Bitbucket都推荐使用BFG Repo-Cleaner。
请参阅:
GitHub: Remove Sensitive Data
Bitbucket: Reduce Repository Size&
Bitbucket: Maintaining a Git Repository
删除超过1兆字节的文件的示例,以及不在HEAD中的jpgs,pngs和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。
答案 1 :(得分:12)
查看ProGit手册中Maintenance and Data Recovery一章中的“删除对象”部分。它提供了有关如何从git仓库中删除对象的步骤。但要注意它是破坏性的。
答案 2 :(得分:9)
我有一个脚本(github gist here)从git repo的整个历史记录中删除一系列不需要的文件夹,或删除除文件夹的最新版本以外的所有文件夹。
它的硬编码假设所有git存储库都在~/repos
中,但这很容易改变。它也应该很容易适应单个文件。
答案 3 :(得分:4)
如上所述,您将在此处重新编写历史记录,因此您必须让合作者(如果有)执行git rebase
。
至于从历史记录中剥离特定文件Github has a nice walkthrough。
对于未来的解决方案,您应该考虑将二进制文件放在子模块中。
Git的子模块支持允许存储库作为子目录包含外部项目的结帐。子模块保持自己的身份;子模块支持只存储子模块存储库位置和提交ID,因此克隆包含项目的其他开发人员(“超级项目”)可以轻松克隆同一版本的所有子模块。可以对超级项目进行部分检查:您可以告诉Git克隆无,部分或全部子模块。
答案 4 :(得分:2)
据我所知,这是无法做到的,因为在git中,每次提交都取决于整个历史记录的内容。因此,摆脱旧的大文件的唯一方法是“重放”整个提交历史(最好使用相同的提交时间戳和作者),省略大文件。请注意,这将生成完全独立的提交历史记录。
这显然不是一种非常可行的方法,因此教训可能是“不要使用git来编写巨大的二进制文件”。相反,你可能有一个单独的(被忽略的)文件夹,并使用一个单独的系统来控制它们。