25

我有一个 Git 存储库,其中包含几个巨大的媒体文件(图像和音频文件)。这些媒体文件的多个版本已陆续提交到 repo。这些文件是相同资产的连续精炼版本,它们具有相同的名称。

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

4

5 回答 5

24
于 2014-01-14T21:52:49.400 回答
10

检查ProGit 书中维护和数据恢复一章中的“删除对象”部分。它提供了有关如何从 git 存储库中删除对象的步骤。但请注意,尽管它具有破坏性。

于 2011-06-15T14:16:28.800 回答
8

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

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

于 2014-05-23T15:13:36.040 回答
4

如前所述,您将在这里重写历史,因此您必须让合作者(如果有的话)来做git rebase.

至于从历史中剥离特定文件,Github 有一个很好的演练

对于未来的解决方案,您应该考虑将二进制文件放在子模块中。

Git 的子模块支持允许存储库作为子目录包含外部项目的签出。子模块保持自己的身份;子模块支持仅存储子模块存储库位置和提交 ID,因此克隆包含项目(“超级项目”)的其他开发人员可以轻松地克隆同一修订版的所有子模块。超级项目的部分签出是可能的:您可以告诉 Git 不克隆任何子模块、部分或全部子模块。

https://git-scm.com/docs/git-submodule

https://git-scm.com/book/en/v2/Git-Tools-Submodules

于 2011-06-15T14:08:42.067 回答
2

据我所知,这是做不到的,因为在 git 中,每次提交都取决于到那时为止的整个历史记录的内容。因此,摆脱旧的大文件的唯一方法是“重播”整个提交历史(最好使用相同的提交时间戳和作者),省略大文件。请注意,这将产生一个完全独立的提交历史。

这显然不是一个非常可行的方法,所以教训可能是“不要使用 git 来版本巨大的二进制文件”。相反,您可能有一个单独的(忽略的)文件文件夹,并使用单独的系统对它们进行版本控制。

于 2011-06-15T13:43:55.733 回答