在VCS中存储.jar文件的最佳实践(SVN,Git,…)
我知道,在Maven时代,不建议将库存储在VCS中,但有时它仍然有意义。
我的问题是如何最好地存储它们 – 压缩或未压缩? 未压缩它们更大,但如果它们被更新的替换了几次,那么两个未压缩的.jar文件之间存储的差异可能比压缩文件的差异小得多。 有人做过一些测试吗?
在VCS(SVN,Git,…)中存储.jar文件的最佳做法:不要。
它可以在像SVN这样的CVCS(集中式VCS)中有意义,它可以处理数百万个文件,无论它们的大小如何。
它不在DVCS中,特别是像Git( 及其限制 ):
- 二进制文件不适合VCS 。
- 默认情况下,克隆DVCS仓库将获得所有历史记录,包括所有jar版本。
这将是缓慢的并占用大量的磁盘空间,无论这些jar的压缩程度如何。
您可以尝试使用浅层克隆 ,但这非常不实用。
使用第二个存储库(如Nexus )存储这些jar,并仅引用txt
文件(或Maven项目的pom.xml
文件)以获取正确的jar版本。
工件仓库更适合分发和发布管理目的 。
总而言之,如果你必须将jar存储在Git仓库中,我建议最初以压缩格式存储它们(这是jar的默认格式:请参阅创建JAR文件 )
压缩和未压缩格式都将被Git视为二进制格式,但至少在压缩格式中,克隆和结帐将花费更少的时间。
但是,很multithreading都提到了以非压缩格式存储jar的可能性:
我正在使用一些repos,它会定期检查50MB的tarball。
我说服他们不压缩tarball,git在它们之间进行delta压缩是相当不错的工作(虽然它需要相当多的RAM才能这样做)。
你在Git上有更多关于detified对象的信息 :
- 如果你正在处理二进制或文本,它没有任何区别;
- 增量不一定与先前版本中的相同路径相同,因此即使添加到历史记录中的新文件也可以以经过筛选的形式存储;
- 当使用存储在经过整理的表示中的对象时,与在压缩的基本表示中使用相同的对象相比,它将产生更多的成本。 完成机制需要权衡这一成本以及空间效率。
因此,如果克隆和检出不是您每5分钟必须执行的常见操作,那么在Git中以未压缩格式存储jar会更有意义,因为:
- Git会压缩/计算这些文件的增量
- 您最终会在工作目录中使用未压缩的jar,然后可能会更快地加载jar。
建议:未压缩 。
您可以使用类似的解决方案,如“解压缩OpenOffice文件,以便在版本控制中更好地存储”这一问题,例如使用clean / smudge gitattribute,使用rezip作为filter来存储未压缩的*.jar
文件。
.jar
文件已经(可以)压缩,第二次压缩它们可能不会产生你期望的尺寸改进。