是否有类似于SVN、Git或Mercurial这样的版本控制系统可以“保留最新版本”但不保留修订记录(例如用于二进制文件)?

10
在我们的项目文件中,如果存在二进制文件,例如 .doc,.xls,.jpg,而我们选择不保留它们的过去版本(仅保留最新版本即可),那么是否有一种方法可以告诉 SVN,Git 或 Mercurial 或其他工具跳过这些文件或特定文件夹的修订版本?
比如说,有一个大小为 4MB 的 .doc 文件,我需要检查它数百次,但其过去版本并不重要。因此,如果系统保存了 100 个版本,就已经占用了 400MB...检入 300 次意味着一个文件需要占用 1.2GB,这不好。只有最新版本对每个人都是好的,这样每个人都可以同步到它。此外,我也不希望其他人检出项目时必须检出 20GB 的东西。(Git 和 Mercurial 是否会在每个人的本地存储库中保留所有修订版本?)

9
当然,有很多种:它们被称为“文件系统”。 :-) - Ken
3
为什么你不关心过去的修订记录呢?除非是自动生成的文件,否则有人认为这些文件本来就不应该被纳入版本控制。 - Chris K
1
但是文件系统不会让你自动同步删除、添加、重命名文件,也不会同步任何文件夹结构的更改。 - nonopolarity
10个回答

17
请注意,这不是完整的答案。
如果我不讨论保留文件正确版本以备后用的问题,我至少要评论一下您问题中的一个部分,这可能会让您重新考虑不在存储库中保留文件的所有修订版。
版本控制系统通常不会在每个新版本上存储整个文件,而是存储更改。根据系统的不同,您可能偶尔会有文件的完整副本,但大多数变更集仅包含更改内容。
例如,在Mercurial中,我试过这个:首先从此URL下载C# 3.0语言规范的Word文档:http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a8-75351c669b09/CSharp%20Language%20Specification.doc
然后我将其提交到全新的Mercurial存储库中。提交之前的大小(空存储库)为80字节,磁盘上文件的大小为2,387,968字节,提交后存储库的大小为2,973,696字节。请注意,该文件现在实际上存储了两次,一次是在我的工作副本中(我可以编辑的那个),一次是作为我的初始提交的一部分在我的存储库中。
然后我打开该文件,将所有出现的“3.0”更改为“4.0”(不带引号),并将所有出现的“C#”更改为“VB”,然后保存。然后我用一个单字母注释提交了新版本。提交后存储库的大小现在为3,497,984字节。差异为512KB(存储库中涉及一些块处理,因此大小是确切的512KB值)。如果我现在重新打开文件,仅将标题页VB更改为C#,然后保存并再次提交,代码库的大小将增加276KB,达到3.780.608字节。
正如您所看到的,更改并不会提交整个文件的副本,但诚然,差异也不是在“10KB”的范围内。
假设每个diff的平均大小,仅针对此文件,将介于这两个值之间,平均为50%。 这意味着对该文件进行300次更改,平均为394KB,总共需要115MB。 这并不算太多。
我的建议如下:
停止小气,硬盘空间很便宜,与之相比,当有人说:“我真希望知道上周在破坏它之前那个文件看起来像什么时,你将面临的麻烦”

1
在工作中,如果很少使用硬盘空间,我认为这并不重要。但如果是家用电脑,随着时间的推移,我真的不想浪费20GB、30GB或60GB的空间。如果电脑有300GB的硬盘,仅仅因为不关心而浪费了10%的空间。 - nonopolarity
此外,Lasse 正在查看文本文件,但我正在谈论二进制文件。 - nonopolarity
1
大多数版本控制系统仅存储二进制文件的差异,文本只是一种带有解释的二进制文件。 - Lasse V. Karlsen
1
@动静能量 Lasse正在谈论一个.doc文件。.doc文件不是文本文件。它是一种专有的二进制格式,恰好可以存储文本信息。 - HardlyKnowEm

4

快速检查硬盘价格,1TB内置硬盘约为每个75美元。按照您的计算,这是250,000份4MB文件的副本,或每份0.0003美元。程序员一小时的典型开销约为100美元。

哪个花费更多:保留所有版本的文件还是支付程序员重新创建旧版本(如果您将来需要该副本)?


1
我同意你的观点,但是主要成本不在硬盘上,而在于(磁带)备份。 - ur.
1
这甚至更容易:备份到外部硬盘。它们比磁带更快、更可靠,而且一旦考虑到磁带切换器和所有媒体的价格,它们更便宜。 - Craig Trader
请注意,那个75美元是指“消费者”硬盘,如果你说的是“SAN”硬盘,我听说它们的价格大约是每TB 1000美元...(这些信息可能有点过时,但你明白我的意思) - Pharaun
企业级硬盘的价格比消费级硬盘稍微贵一些,但它们并不贵到十倍的程度。即使是这样,存储一个4MB的文件仍然只需要0.003美元。 - Craig Trader
即使像版本控制每月需要5美元的磁盘空间这样奇怪的费用,与开发过程中节省的时间和避免的麻烦相比,那根本算不了什么。即使一名实习生每小时支付25美元,能够修复一个原本需要他半小时时间的错误,你已经超过了你的投资回报。 - dimo414
1
具有讽刺意味的是,您强调节省程序员的时间非常重要,但未能计算等待复制千兆字节不必要的版本化二进制文件以进行初始克隆的程序员时间成本。程序员倾向于假设他们可以“获取并继续使用”DVCS存储库;半小时的下载时间会带来不愉快的惊喜。 - Ron Burk

4

我知道有一种方法可以实现这个功能,但是你可能不会喜欢这个答案。

这种方法是使用Visual Sourcesafe。在文件上勾选“仅存储最新版本”标志,它就不再保留历史记录。

如果你想在一个好的源代码管理系统中实现这个功能,我建议你根本不要将该文件放入源代码管理系统中,而是将其存储在其他地方,比如文档管理解决方案,甚至只是一个文件系统共享。


3

这不是版本控制系统的工作,而是文件系统的工作,就像Ken所说的那样。

但是,如果你确实需要这样的“功能”,你可以使用钩子机制,从历史记录中删除先前(比如早于3个提交)版本的文件。


2
针对您的特定需求,如果您想随时删除过去的版本,那么一个设计用于永远不会丢失任何版本的版本控制系统(VCS)并不适合。您需要寻找一个更高级的解决方案——仓库管理器(比简单的共享文件系统路径更先进)。例如 Nexus Sonatype

2
Perforce可以为您完成这项任务。 检查文件类型: +S 仅存储最新的版本。 旧版本在提交新版本后会从存储库中删除。适用于可执行文件或.obj文件。
-或-
+Sn 仅存储最近的n个版本,其中n是1到10、16、32、64、128、256或512之间的数字。 当提交超过n个新版本或将现有的+Sn文件的n更改为小于其当前值的数字时,旧版本将从存储库中删除。有关详细信息,请参阅命令参考。

1
版本控制系统的主要职责是保存变更历史记录,因此我不认为这是可能的。如果您只想要最新版本,为什么要使用版本控制呢?

1
一般来说,版本控制系统(VCS)旨在保留整个历史记录。但是,在空间方面并非一无所获;您提到的所有系统都将为每个修订版本存储二进制差异,而不是整个文件的完整副本。这意味着所需的空间通常会少得多。

1
为什么不使用SVN来处理二进制文件,使用DVCSS来处理所有源文件呢?这样,您可以将所有修订版本保存在服务器端,但客户端只需保留一份副本。对于其他源文件,您可以获得真正的版本控制系统的好处。
我理解我们想要在某个地方保留二进制文件的所有修订版本,但不想为每个开发人员在他们拥有的每个克隆上进行的每次“拉取”付出代价。那可能是滥用的。

0

如果你只是想在多台电脑之间同步文件,可以使用Dropbox

如果你正在使用版本控制,请参考Lasse V. Karlsen的建议,磁盘空间很便宜。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接