我需要保留一些大文件(一些 Gigs)的版本。
我不需要,也不能保留所有版本的文件。我希望能够在某个时刻从我的 VCS 大文件版本中删除。
我想要保留在版本控制之下的文件是大的 .zip 文件或 ISO 映像。这些文件可能包含可执行软件或数据(地震数据、SAR 图像、GNSS 数据),它们由我公司的软件供应商提供。
我可以使用什么控制版本系统?
我需要保留一些大文件(一些 Gigs)的版本。
我不需要,也不能保留所有版本的文件。我希望能够在某个时刻从我的 VCS 大文件版本中删除。
我想要保留在版本控制之下的文件是大的 .zip 文件或 ISO 映像。这些文件可能包含可执行软件或数据(地震数据、SAR 图像、GNSS 数据),它们由我公司的软件供应商提供。
我可以使用什么控制版本系统?
在 CVS 中,您可以通过从 repo 中删除文件来做到这一点。Subversion 允许通过转储 repo 的内容并对其进行过滤以删除文件(这有点麻烦)。Perforce 对此有一个obliterate
命令。许多较新的分布式 VCS 由于在各处使用散列而变得相当困难,而且您的存储库可能已在其他地方复制的事实也使事情变得复杂。Hg 有一个strip
命令(Mq
扩展的一部分),我认为 Git 也可以做到。
我认为没有任何版本控制系统可以让您定期执行此操作,因为这与版本控制系统所代表的一切背道而驰。
不知何故,我觉得你根本不应该使用版本控制系统。如前所述,您尝试做的事情与您首先需要版本控制系统的一切背道而驰。
我建议您创建一个对您要完成的工作有意义的文件系统目录结构,以便您可以构建数据。只需备份这些文件。
Perforce 通常允许以两种方式放置文件,仅作为主要修订版(因此,您每个人都只有一份副本)或所有修订版。Perforce 确实有管理员级别的 obliterate 命令,可用于删除修订。由您来查询文件列表,可能按日期或修订数量,并指定 obliterate 命令的修订。顾名思义 obliterate 从数据库中永久删除修订,因此,我总是生成脚本来执行此操作并在运行它们之前对其进行检查。如果 obliterate 命令没有使用 -Y 标志运行,它将生成一个将被删除的列表,这也非常有用。
TFS 有一个 destroy 命令,您可以使用它来永久删除您认为合适的文件或修订。
此MSDN 文章中有更多信息。
在我看来,您需要一个智能备份系统,而不是版本控制。
我使用SyncBackSE;它允许您保留许多以前的版本,还可以执行诸如“忽略 30 天前更改的所有文件”之类的操作。
它是我使用的少数付费软件之一。我认为值得一试。
许多版本控制系统允许您以某种方式配置它们,以便它们仅存储文件的多个版本之间的差异并通过它节省空间。
例如,如果您提交了一个 1Gig 文件,更改其中的一部分并再次提交,则只有更改的部分将存储在版本控制系统中。
不会使用 2Gigs(初始文件和新文件),而只会使用 1Gig+sizeOfChanges。
只有一个缺点:如果您存储的文件在修订版本之间更改其全部内容,这也可能适得其反,因为更改占用的空间几乎与原始版本相同。存档文件是此类文件的一个示例,其中(实际)内容中的微小更改可能会导致存档文件的内容完全更改。
我建议您根据您的特定需求和环境自行测试多个版本控制系统,并在服务器端监控每个系统的存储需求如何变化。
一些分布式版本控制系统允许创建“检查点”,允许您将此版本用作基础修订版,并防止您在每次结帐时提取检查点之前的所有历史记录。因此,您可以删除大文件,创建检查点,然后将存储库从该检查点检出/克隆到新目录。然后你有一个新的小型存储库,但没有检查点之前的历史记录。如果您不需要该历史记录,您可以将旧存储库刻录到 CD 上并从现在开始使用新的、部分存储库。
我只在darcs中测试过它,它在那里工作,但 YMMV 取决于版本控制系统和用例。
I would save such files under a unique name (datestamped, perhaps), and perhaps additionally make a textual reference to the external file in the version control system.
Fossil allows you to do this via the "shun" mechanism. Fossil being a distributed SCM, however, means that this does not affect all repositories (for obvious reasons).