我刚刚发现了一个仍在使用CVS的开源项目。我想知道现在还有什么理由比CVN或Git更喜欢CVS。 (我不认为懒得迁移作为答案!;-))
CVS有没有其他两个缺乏的东西?比如说,支持$ OS或$ fancy_tool?
在“What are the advantages of using SVN over CVS?”中有详细说明为什么不使用CVS。但我想反过来问问。 CVS不可能都是坏事。或者是吗?
答案 0 :(得分:22)
我仍然使用CVS作为我个人的一些东西。
与Git不同,您只能轻松检出存储库的一个子集。
CVS为每个文件分配顺序版本号(1.1,1.2,1.3,...)。在Git中,版本号是40个字符的十六进制校验和。在SVN中,修订号在整个存储库中是顺序的;给定的数字适用于整个存储库。
CVS允许您在签出时将版本号扩展到每个文件中,从而可以轻松识别文件的版本,而无需参考其来自的存储库。
因此,当存储库是大量不相关文件的集合时,我发现CVS(有时甚至是RCS)很方便,而且我更感兴趣的是跟踪单个文件的更改,但整个存储库的修订并不是特别有意义
(如果存储库包含用于构建单个程序或库的源文件,那就不会出现这种情况;在这种情况下,您需要整个项目的连贯历史记录。)
最后,CVS将每个文件的历史记录存储在单个文件中(使用RCS使用的相同格式),格式相对简单。至少一次,我不得不手动重建已损坏的已保存的CVS文件。我不确定如何用SVN或Git做到这一点。
更新:这个问题引出了一些无法解释的暗示。我只能猜测原因(我并不担心偶尔的downvote),但也许有些读者认为我提倡CVS比SVN或Git更好的系统。我不是;我只是指出CVS在一些相当狭窄的情况下可以有一些优势。
答案 1 :(得分:6)
您必须了解Subversion是为了直接替换CVS以及开发人员对CVS的问题而编写的。编写了Subversion,因此CVS用户可以轻松地从CVS转换到Subversion,因为他们使用相同的工作流程和许多类似的概念。
这有点像问MS-DOS如何优于Windows作为操作系统。我可以想出一些虚假的原因(“嗯......呃...... MS-DOS需要更少的内存。”)。但是,最终,编写Windows是为了解决MS-DOS的缺点。
一旦你理解了推理,CVS对Subversion更好的一些原因根本就没有用处:
,v
文件中,分支和标记都在文件开头的特定修订中别名。实际上,您使用相同的命令:cvs tag
来创建分支或标记。这是Subversion没有区分这两个概念的原因之一。但是,通过对分支和标签进行相同处理,Subversion确实为您提供了跟踪分支或标记历史记录的方法。是谁创造了它?它基于什么修订?它改变了吗? Subversion还为您提供了一种查看存储库中所有标记或分支的简便方法。在CVS中,您必须浏览每个文件。CVS是对RCS的重大改进。在CVS中,您无需在更改文件之前锁定文件。在CVS中,您可以在不编写某种系统前端的情况下检出整个子树。 RCS是为单个文件的版本而开发的。 CVS将整个存储库版本化为单个项目。
RCS本身是对SCCS的改进。 RCS存储库格式更容易理解。关键字扩展效果更好,而且不那么神秘。您可以拥有分支分支,而SCCS只剩下一个分支级别。 RCS具有内置的标签概念,而SCCS则要求您自己跟踪标签。
SCCS比没有使用源存储库要好得多。
事实是,CVS已被Subversion取代,因为Subversion在十多年前问世,所有关于CVS的工作都已停止。我甚至不认为CVS上的错误会被修复。
答案 2 :(得分:4)
我在CVS的有限使用中遇到的唯一问题是CVS将分支和标签视为不同,并将它们视为它们的内容,而不仅仅是SVN所做的文件夹。有针对这些的特定命令,它们被视为版本控制系统的一等公民。如何在SVN中创建分支? svn copy
。标签?相同。有什么不同?没有什么,除了你如何对待他们。虽然可以说SVN的模型导致简单,但它会导致各种工具误解它们而不会获得文件夹的上下文。如果你看到Git,就会以这种方式与CVS类似。
但绝对是,除了传统原因之外,现在没有理由使用CVS。许多人说SVN的构建是一个更好的CVS,几乎在所有方面,SVN都更好,并且被广泛使用。
答案 3 :(得分:-1)
CVS,git和subversion有不同的工作流程设计。 说(git / subversion旨在修复cvs的问题)是不准确和误导的。 相反,编写了颠覆,因为有人想要一个与CVS / RCS不同的工作流程。然后编写git是因为有人想要另一个不同的工作流程。
表面上看,颠覆和CVS有些相似。 从内存开始,CVS对那些喜欢在本地代码库中使用RCS的人有好处。 RCS很不错,因为它需要强制检出文件。它可以让您明确地知道您在任何时候触摸的文件。因此,它避免了您“意外”触摸其他人的代码部分。