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

Ric*_*aez 23 git git-rewrite-history

我有一个Git存储库,里面有几个巨大的媒体文件(图像和音频文件).这些媒体文件的几个版本已连续提交给回购.这些文件是相同资产的连续精炼版本,并且它们具有相同的名称.

我想只保留Git存储库中的最新版本,因为它变得太大了.
最简单的方法是什么?
如何将这些更改正确地传播到上游存储库?

小智 16

老线程,但万一其他人偶然发现...

GitHub和Bitbucket都推荐使用BFG Repo-Cleaner.

请参阅:
GitHub:删除敏感数据
Bitbucket:减少存储库大小Bitbucket:维护Git存储库

删除超过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
Run Code Online (Sandbox Code Playgroud)

注意:现在您已经推送了更新的转速,远程存储库也应该运行它git gc...否则您将看不到尺寸减小.(参见例如/sf/answers/2014750811/)

最后,重新克隆存储库以确保不会意外地重新提交旧的媒体文件blob.


sat*_*esh 12

请查看ProGit手册中" 维护和数据恢复 "一章中的"删除对象"部分.它提供了有关如何从git仓库中删除对象的步骤.但要注意它是破坏性的.


Kev*_*ght 9

我有一个脚本(github gist here)从git repo的整个历史记录中删除一些不需要的文件夹,或删除除文件夹的最新版本之外的所有文件夹.

假设所有git存储库都在其中~/repos,这是很难编码的,但这很容易改变.它也应该很容易适应与单个文件一起使用.