源代码控制(TFS)中的大文件

16

最近我们公司讨论是否将大文件放入 TFS 存储库中。这些文件本身是 XML 格式,通常大小在 100-200MB 左右,有时甚至达到 1GB 大小。我们将它们用作自动化测试数据,它们大多数是静态的(每年可能会进行微小调整)。无论如何,有一种观点认为将此类文件放入存储库中是不可取的,因为它们“很大”,这将使事情变得“慢”(除了最初的签入/签出),但我们实际上没有任何证据来支持这一点。

因此,我的问题是,在像 TFS(或 SVN、Git 等)这样的源代码存储库中放入大型静态文件的利弊和影响是什么?这样做可以吗?会“填满服务器”或者带来其他严重后果吗?

3个回答

28

简要总结: TFS的设计能很好地处理大文件。上传/下载文件时需要面临的最大难题是网络带宽,其次是服务器存储空间。如果已经考虑到这两个问题,就不应该有其他问题。

网络带宽:检入或获取文件时,几乎没有额外开销,速度应该与典型的HTTP上传或下载一样快。如果客户端与服务器在网络方面相距较远,则可以在本地网络上为他们安装TFS源代码控制代理以加速下载。

请注意,与某些版本控制系统不同,TFS在上传或下载新内容时不会计算和传输增量。也就是说,如果客户端有一个大文本文件的第4个版本,并且第5个版本在末尾添加了几行,则一些版本控制工具会优化这种体验,只发送更改的行。 TFS不进行此优化,因此如果您的文件经常更改,则每次客户端都需要下载整个文件。

服务器存储:服务器上的磁盘空间非常简单-除了需要足够的空间来保存文件之外,几乎没有其他开销。TFS不会因为您的仓库包含大文件而变慢。

如果这些文件经常被修改,则还需要考虑版本使用的磁盘空间。TFS在文件版本之间存储“增量”-也就是两个版本之间的二进制差异。因此,如果文件的内容在版本之间发生微小变化(如典型的文本文件用例),则存储成本应该不高。然而,如果整个内容发生变化,例如图像或DLL等二进制文件的典型情况,则需要足够的磁盘空间来存储每个版本。(当然,您可以销毁以前的版本以恢复那些空间。)

关于TFS中的增量变化,请注意:为了减少提交时间的开销,修订版本之间的增量不会立刻计算,有一个后台“增量计算”任务每晚运行以计算出增量来节省空间。在此之前,每个修订版本都将完整存储在数据库中。因此,如果您有一个非常大的文本文件并且每天发生很多修订版本,则您的磁盘空间需求将需要考虑到这一点。
客户端存储:客户端也需要足够的磁盘空间来存储这些文件(尽管仅存储他们已下载的修订版本)。可以通过工作区映射来缓解这种情况,使得不需要的大型文件被屏蔽(或者不包含在您的工作区中)。
注意事项:获取历史版本:如果您经常请求大文件的历史版本(例如:我想要七个变更集之前的ISO镜像),那么您将要求服务器应用增量链以返回该修订版本。如果您有多个客户端同时这样做,这可能会占用您的内存。

啊,这非常好,信息齐全。我认为TFS将是最佳选择,因为我们现在正在不断地从网络位置访问文件,由于上述带宽原因,这需要很长时间。 - A.R.
7
需要翻译的内容:One thing to add, afaik deltification is disabled for files above 16 MB (which is true in your case). I found info about it on http://blogs.msdn.com/b/billheys/archive/2011/05/05/how-tfs-stores-files-and-calculated-deltas-on-versioned-files.aspx需要翻译的内容翻译为:需要补充一点的是,据我所知,对于超过16MB的文件,增量处理功能会被禁用(这在您的情况中也是如此)。我在http://blogs.msdn.com/b/billheys/archive/2011/05/05/how-tfs-stores-files-and-calculated-deltas-on-versioned-files.aspx上找到了相关信息。 - MichalMa

3
如果那些文件不断变化并且它们的增量很大,我最终会预计到整个TFS性能方面的惩罚。您明确表示这不是问题,因此只要您的SQL服务器有足够的存储容量,我认为您应该能够在没有任何影响的情况下继续进行。你可能会遇到一个小缺点,即在构建新的工作区时,你需要从存储库中提取那些文件。不幸的是,在TFS Build期间也会发生这种情况,所以您的构建可能会花费更长的时间。这个角度的严重程度主要取决于您的网络组合/稳定性。

1
OP指定他试图揭示这些观点背后的原因 - 你能解释一下为什么你会期望有性能损失吗? - bwerks

2
您将遇到的最大问题(不便之处)是需要将这些巨大的文件下载到所有工作区或映射出来。考虑将它们放入单独的团队项目中,以使此过程更加容易(除非您希望将它们包含在分支中,在这种情况下,我会滥用将所有内容保留在一个团队项目中)。
如果您可以控制xml格式,还应考虑一些微调,以使它们更小。这将改善store/get操作的性能以及加载速度...缩短元素和属性名称,减少输出浮点数的小数位数等。您会发现,像这样简单的方案将使GB级别的文件大小减少许多兆字节,并且很容易快速地编写XSLT转换或代码,将文件快速转换为新格式。

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