我目前使用SCCS进行源代码管理,但这个问题一般适用于版本控制系统。
为了确定一段代码的来源,我有时会打开SCCS。文件来寻找并匹配代码周围的插入命令与版本标头。当然,过了一段时间,这些文件很难以这种方式阅读。
有没有办法重新来源'一个SCCS文件,以便第一个存储的版本是5年前的那些 - 并且只保留那时以来的那些增量?我想这可以通过查看你想要的每个版本并将它们重新加入新的仓库来完成,但有人必须自动化该流程,不是吗?
或者,更好的是(?),是否有一个实用程序可以显示使用与每行关联的版本#注释的文件的当前版本?我刚刚看到了一个' annotate'命令在bitkeeper中。那是我要问的那种事情。哎呀。我看到" sccs得到-m"命令做到了(我实际上在我的sccs包装器脚本中有一个选项来执行它)。对不起 - 什么是涂料。
第一个'重新来源'问题仍然存在,但是......
答案 0 :(得分:1)
您正在将一些单独的概念混合在一起(正如您使用annotate子命令所发现的那样)。注释(git annotate
,svn annotate
等)或有时称为“责备”要求VCS向您显示有关源本身的信息和最早的修订版本特定的源片段 - 通常是一行,因为我们主要处理“代码行” - 与一个特定版本中的形式相同。
但这不是你仍在寻找的东西,所以让我们深入研究。所有版本控制系统都有问题:如果你要存储每个文件的每个版本,你可能需要大量的存储空间。
因此,大多数VCS使用某种压缩,并且大多数立即直接使用delta encoding,也称为 delta压缩:完全保存一个版本,而不是存储第二个版本完整,只存储一组指令,可用于修改存储完整的版本以获得第二个版本。
对于许多版本重复此操作,您将获得链式增量,其中您从一些初始版本开始并反复修改它以获得最终版本。最初,SCCS在“向前”方向使用它:存储初始版本,然后将第一个更改存储为第二个版本,然后将更改存储为第二个版本作为第三个版本,依此类推。显然,这有点慢。因此,RCS使用反向增量:存储最新版本,同时存储增量以从其后继版本中计算早期版本。这使得快速检索最新版本,并且最旧版本缓慢 - 通常是人们想要的 - 但它有一个不同的缺点:它不能与分支一起正常工作。因此,RCS实际上在其 trunk 上使用反向增量,并在其分支上转发增量。
由于CVS是(或曾经)构建在RCS文件格式之上,它也使用这种反向转发的delta存储格式。
对于性能,现代SCCS使用称为interleaved deltas的概念,其中存储库存储的数量相当于所有版本的联合。线性传递存储的文件足以提取任何特定版本。 (链接的维基百科页面说Bitkeeper也使用交错的增量。)
我个人并不知道Subversion在内部使用什么,但是How exactly does subversion store files in the repository?建议它使用反向增量和快照。烘焙快照 - 另一个“完整原封”版本 - 现在然后提供一种方法来设置要应用的增量数量的限制。
Git做了一些完全不同的事情。 Git不是单独存储每个文件,而是对该文件的先前版本进行增量压缩,而是存储它所谓的 objects 。每个对象至少在逻辑上是独立的(快照) - 任何文件的版本都不会进行增量压缩,尽管每个快照都是zlib压缩的。为了节省额外的空间,Git偶尔将多个对象压缩成一个“包文件”,这里包文件内部对象做得到delta压缩...但是对任何其他对象,而不仅仅是代表相同源文件的那些。 (特别是这允许Git使用其他树对象压缩树对象。)
最后,这对Git来说意味着它使用delta压缩,可能在任何方向 - 这可能与快照混合正向和反向,以保持链长度有限(--depth
或{{1但是,对象是针对对象的,不一定只是针对同一文件的另一个版本的一个文件。出于实际目的,Git不会完全任意选择这些对象(很难知道哪些对象会提前与其他对象压缩),而是通过树对象中找到的对象类型,对象大小,文件名来实现,以及年龄(我不确定这些年龄从何而来),所以Git经常会以相反的反向增量结束,但并不能保证。 (Git还会重新使用以前包中的预先计算的delta链,除非你告诉它不要;请参阅pack.depth
aka --no-reuse-delta
。)
作为一般规则,没有办法告诉修订系统完全改进其内部存储格式。某些VCS可能有例外。例如,Git有点不寻常,因为-f
正是这样做的,但不是对你的特定用例有用的方式!
答案 1 :(得分:0)
(我不知道为什么地球上你会使用SCCS。)
这些命令在不同的源控制系统中有所不同。 SCCS是古老的,并且不太可能有这样的命令。
在RCS中(这也是古老的,但比SCCS略显现代),你可以使用" -o"删除(" outdate")旧版本文件的选项。例如,如果您的文件包含存储的修订版1.1,1.2,1.3,...,那么您可以使用
rcs -o1.1 filename
从历史记录中删除1.1版,或
rcs -o1.1:1.3
删除修订版1.1,1.2和1.3。
是否有一个实用程序,它将显示使用与每行关联的版本#注释的文件的当前版本
对于大多数现代系统,是的:
cvs annotate filename
svn blame filename
(praise
,annotate
,ann
)git blame filename
hg annotate
或hg blame
我不相信SCCS或RCS都有这样的命令。将RCS文件导入CVS很简单(只需将filename,v
复制到CVS存储库中),并且可能有自动工具将SCCS存储库转换为RCS存储库。
这些命令显示文件当前版本的逐行注释,这意味着他们不会向您提供有关已删除行的任何信息。为此,您可以使用一些类似diff的命令来比较指定的版本(rcsdiff
,cvs diff
,svn diff
,git diff
,hg diff
)。