似乎更多的源代码控制系统仍将文件用作存储版本数据的手段。Vault和TFS使用Sql Server作为它们的数据存储,我认为这对于数据一致性和速度会更好。
因此,为什么SVN,我相信GIT,CVS等仍然将文件系统用作本质上的数据库(我问这个问题,因为我们的SVN服务器只是在正常提交期间损坏了自己),而不是使用实际的数据库软件( MSSQL,Oracle,Postgre等)?
编辑:我想问我的问题的另一种方式是“为什么VCS开发人员推出自己的结构化数据存储系统而不使用现有的结构化数据存储系统?”
似乎更多的源代码控制系统仍将文件用作存储版本数据的手段。Vault和TFS使用Sql Server作为它们的数据存储,我认为这对于数据一致性和速度会更好。
因此,为什么SVN,我相信GIT,CVS等仍然将文件系统用作本质上的数据库(我问这个问题,因为我们的SVN服务器只是在正常提交期间损坏了自己),而不是使用实际的数据库软件( MSSQL,Oracle,Postgre等)?
编辑:我想问我的问题的另一种方式是“为什么VCS开发人员推出自己的结构化数据存储系统而不使用现有的结构化数据存储系统?”
Answers:
TL; DR:很少有版本控制系统使用数据库,因为它不是必需的。
作为一个问题的答案,为什么不呢?在这种情况下,“真实的”数据库系统相对于文件系统有什么好处?
考虑到修订控制主要是跟踪少量的元数据和大量的文本差异。文本不能更有效地存储在数据库中,内容的可索引性也不会成为因素。
让我们假设Git(出于参数考虑)使用BDB或SQLite DB作为其后端来存储数据。哪一个更可靠?任何可能破坏简单文件的内容也可能破坏数据库(因为这也是具有更复杂编码的简单文件)。
从程序员除非必要就不进行优化的范式来看,如果修订控制系统足够快且足够可靠地工作,为什么要更改整个设计以使用更复杂的系统?
您似乎在做出许多假设,可能是基于您对SVN和CVS的经验。
比较git和CVS就像比较iPad和Atari。CVS是在恐龙漫游地球时创建的。Subversion基本上是CVS的改进版本。假设像git和Mercurial这样的现代版本控制系统像它们那样工作几乎没有任何意义。
为什么?关系数据库确实非常复杂,并且可能没有单一用途的数据库有效。我的脑海有些变化:
同样,为什么呢?您似乎以为,因为数据存储在文件中,所以git和Mercurial之类的版本控制系统没有原子提交,但它们确实有原子提交。关系数据库也其数据库存储为文件。这里值得注意的是CVS 不会执行原子提交,但这很可能是因为它来自黑暗时代,而不是因为它们不使用关系数据库。
一旦将数据放入数据库中,还存在防止数据损坏的问题,答案也相同。如果文件系统已损坏,则使用哪个数据库都没有关系。如果文件系统未损坏,则数据库引擎可能已损坏。我不明白为什么版本控制数据库比关系数据库更容易出现这种情况。
我认为,分布式版本控制系统(如git和Mercurial)比集中式版本控制更适合保护数据库,因为您可以从任何克隆还原整个存储库。因此,如果中央服务器与所有备份一起自然燃烧,则可以通过git init在新服务器上运行来恢复它,然后git push从任何开发人员的计算机上恢复它。
仅仅因为您可以将关系数据库用于任何存储问题,并不意味着您应该这样做。为什么使用配置文件而不是关系数据库?当您可以将数据存储在关系数据库中时,为什么将图像存储在文件系统上?当您可以将所有代码存储在关系数据库中时,为什么还要将代码保留在文件系统上?
还有一个事实是,开源项目有能力在方便的时候重新发明轮子,因为您没有商业项目那样的资源约束。如果您有一位自愿编写数据库的志愿者,那么为什么不使用它们呢?
至于为什么我们希望版本控制系统的作者知道他们在做什么。.我不能代表其他VCS,但是我非常有信心Linus Torvalds可以 理解文件系统。
最有可能是以下各项的组合:
svnsvngithg
实际svn用于将BDB用于存储库。最终将其消除,因为它容易断裂。
当前使用DB(SQLite)的另一个VCS是fossil。它还集成了一个错误跟踪器。
我对真正原因的猜测是,VCS可处理大量文件。文件系统只是另一种数据库(分层的,专注于CLOB / BLOB存储效率)。普通数据库不能很好地解决这一问题,因为没有理由-文件系统已经存在。
文件系统是一个数据库。当然,它不是关系数据库,但是大多数都是非常有效的键/值存储。而且,如果您的访问模式针对键值存储(例如git存储库格式)进行了精心设计,那么使用数据库可能不会比使用文件系统提供明显优势。(实际上,这只是妨碍实现的另一层抽象。)
许多数据库功能只是多余的负担。全文搜索?全文搜索对源代码有意义吗?还是需要以不同的方式标记它?这还要求您在每个修订版中存储完整文件,这是不常见的。为了节省空间,许多版本控制系统都在同一文件的修订版之间存储增量,例如Subversion和Git(至少在使用打包文件时)。
跨平台的要求使使用数据库更具挑战性。
大多数版本控制工具都可以在多个平台上运行。对于集中式版本控制工具,这仅影响服务器组件,但是仍然难以依靠单个数据库服务器,因为Unix用户无法安装Microsoft SQL Server,而Windows用户可能不愿意安装PostgreSQL或MySQL。文件系统是最小公分母。但是,有几种工具必须将服务器安装在Windows机器上,因此需要SQL Server,例如SourceGear Vault和Microsoft Team Foundation Server。
分布式版本控制系统使这更具挑战性,因为每个用户都可以获取存储库的副本。这意味着每个用户都需要一个数据库将存储库放入其中。这意味着该软件:
因此,大多数分布式版本控制系统仅使用文件系统。SourceGear的Veracity是一个明显的例外,它可以存储在SQLite数据库(对本地存储库有用)或关系数据库(如SQL Server)(可能对服务器有用)。他们的云托管产品可能使用非关系存储后端,如Amazon SimpleDB。 ,但我不知道这是真的。
据我在许多产品中所看到的,似乎文件“足够好”地完成工作,这是合理的,考虑到在一天结束时VCSes输出也是文件。
有许多公司提供带有svn / git / etc接口的RDBMS后端,因此您所要求的基本上已经存在。
我会说这是因为版本控制系统的主要数据结构是DAG,它很难映射到数据库。许多数据也是内容可寻址的,这也很难映射到数据库。
数据完整性不是VCS唯一关注的问题,它们还与版本历史记录有关完整性有关,而数据库的不是很出色。换句话说,当您检索一个版本时,不仅需要确保该版本没有当前缺陷,而且还需要确保其整个历史中的所有内容都没有被秘密修改。
除了企业产品之外,VCS还是消费产品。人们在一个人的小型业余爱好项目中使用它们。如果您增加了安装和配置数据库服务器的麻烦,那么您将疏远大部分市场。我猜您在家里看不到很多Vault和TFS安装。这是电子表格和文字处理器不使用数据库的相同原因。
同样,这更是DVCS的原因,但是不使用数据库使其变得非常可移植。我可以将源树复制到拇指驱动器上,然后在任何计算机上重用它,而无需配置数据库服务器进程。
至于提交期间的损坏,VCS使用与数据库完全相同的技术来防止同时访问,使事务原子化等。两者中的损坏很少见,但确实 会发生。出于所有目的和目的,VCS数据存储库是一个数据库。
更好的灾难恢复(最坏的情况:像过去一样,我们会通过肉眼来解析它)
简化由VCS系统故障引起的此类灾难的跟踪和调试。
减少依赖性数量。(让我们不要忘记这些系统中的一个处理的内核,另一个是应该)
文本编辑器始终可用。(MS SQL Server许可证...不多)
sqlite是文本文件的唯一可能替代方案。(idk,也许您可能已经错过了DVCS的“分布式”部分)。其他任何事情都太麻烦了(配置+防火墙+许可证),甚至很愚蠢而无法分发。然后再次对sqlite进行最坏情况的验尸可能会很难。
化石是出色的分布式版本控制系统(DVCS),使用SQLite进行存储,没有纯文本文件。
我真的很喜欢它已经集成:错误跟踪,Wiki,并且它确实是分布式的。我的意思是您可以真正脱机工作并修复错误。
Fossil使用Sqlite作为其应用程序文件格式。在PgCon的主题演讲中, Richard Hipp博士解释了将sqlite用作应用程序文件系统的优点,并对使用数据库作为文件系统的好处提出了令人信服的论点。
第二个主要主题是将SQLite视为一种应用程序文件格式,这是发明自己的文件格式或使用ZIPED XML的替代方法。语句“ SQLite不能替代PostgreSQL。SQLite替代了fopen()”钉子(幻灯片21)。最后,Richard重点强调了SQLite会处理您的数据(崩溃安全,ACID)的事实use-the-index.com
现在,希普博士已经解决了将代码保存在数据库中的问题
Fossil不是基于SQLite。Fossil的当前实现使用SQLite作为分布式数据库内容的本地存储,并用作有关分布式数据库的元信息的缓存,该信息已预先计算以方便快速地呈现。但是,在此角色中使用SQLite是实现细节,而不是设计的基础。Fossil的某些将来版本可能会取消SQLite,并用一堆文件或键/值数据库代替SQLite。(实际上,这不太可能发生,因为SQLite在其当前角色中表现出色,但关键是从Fossil省略SQLite是一种理论上的可能性。)