我有一个 Git 存储库,其中包含几个巨大的媒体文件(图像和音频文件)。这些媒体文件的多个版本已陆续提交到 repo。这些文件是相同资产的连续精炼版本,它们具有相同的名称。
我只想在 Git 存储库中保留最新版本,因为它变得太大了。
最简单的方法是什么?
如何将这些更改正确传播到上游存储库?
我有一个 Git 存储库,其中包含几个巨大的媒体文件(图像和音频文件)。这些媒体文件的多个版本已陆续提交到 repo。这些文件是相同资产的连续精炼版本,它们具有相同的名称。
我只想在 Git 存储库中保留最新版本,因为它变得太大了。
最简单的方法是什么?
如何将这些更改正确传播到上游存储库?
检查ProGit 书中维护和数据恢复一章中的“删除对象”部分。它提供了有关如何从 git 存储库中删除对象的步骤。但请注意,尽管它具有破坏性。
我有一个脚本(这里是 github gist),可以从 git repo 的整个历史记录中删除一些不需要的文件夹,或者删除除最新版本之外的所有文件夹。
假设所有 git 存储库都在 中是硬编码的~/repos
,但这很容易改变。它也应该很容易适应使用单个文件。
如前所述,您将在这里重写历史,因此您必须让合作者(如果有的话)来做git rebase
.
至于从历史中剥离特定文件,Github 有一个很好的演练。
对于未来的解决方案,您应该考虑将二进制文件放在子模块中。
Git 的子模块支持允许存储库作为子目录包含外部项目的签出。子模块保持自己的身份;子模块支持仅存储子模块存储库位置和提交 ID,因此克隆包含项目(“超级项目”)的其他开发人员可以轻松地克隆同一修订版的所有子模块。超级项目的部分签出是可能的:您可以告诉 Git 不克隆任何子模块、部分或全部子模块。
据我所知,这是做不到的,因为在 git 中,每次提交都取决于到那时为止的整个历史记录的内容。因此,摆脱旧的大文件的唯一方法是“重播”整个提交历史(最好使用相同的提交时间戳和作者),省略大文件。请注意,这将产生一个完全独立的提交历史。
这显然不是一个非常可行的方法,所以教训可能是“不要使用 git 来版本巨大的二进制文件”。相反,您可能有一个单独的(忽略的)文件文件夹,并使用单独的系统对它们进行版本控制。