SCCS 代表源代码控制系统 (Source Code Control System)。SCCS 为实现以下目标提供了途径:
跟踪源文件的演变-即其更改历史
防止源文件被其他开发人员同时更改
通过提供版本标记来跟踪版本号
SCCS 的三项基本操作是:
将文件置于 SCCS 控制下
签出文件进行编辑
签入文件
本部分以上一程序为例向您展示如何使用 SCCS 来执行这些任务。只对基本的 SCCS 进行了说明,并且只介绍了三个 SCCS 命令:create、edit 和 delget。
建立 SCCS 目录
在文件中插入 SCCS ID 关键字(这是可选的)
创建 SCCS 文件
首先,必须在正在开发程序的目录下创建 SCCS 子目录。使用以下命令:
demo% mkdir SCCS |
SCCS 必须采用大写字母。
有些开发人员会在每个文件中放入一个或多个 SCCS ID 关键字,但这是可选的。以后,每次用 SCCS get 或 delget 命令签入文件时,都会用版本号来标识这些关键字。有三种可能的位置可以放置这些字符串:
注释行
参数语句
初始化数据
使用关键字的优点是版本信息会出现在源列表和已编译的目标程序中。如果其前面有字符串 @(#),可用 what 命令打印目标文件中的关键字。
只含有参数和数据定义语句的已包含头文件不会生成任何初始化数据,因此这些文件的关键字通常置于注释或参数语句中。在某些文件中,如 ASCII 数据文件或 makefile,SCCS 信息将会出现在注释中。
SCCS 关键字以 %keyword% 形式出现,并通过 SCCS get 命令扩展成各自的值。最常用的关键字有:
%Z% 扩展为 what 命令识别的标识字符串 @(#)。%M% 扩展为源文件名。%I% 扩展为本 SCCS 维护文件的版本号。%E% 扩展为当前日期。
例如,可以用包含以下关键字的 make 注释来标识 makefile。
# %Z%%M% %I% %E% |
源文件 startupcore.f、computepts.f 和 pattern.f 可以通过以下格式的初始化数据来标识:
CHARACTER*50 SCCSID DATA SCCSID/"%Z%%M% %I% %E%\n"/ |
用 SCCS 处理该文件,进行编译,然后用 SCCS what 命令处理目标文件,显示如下:
demo% f95 -c pattern.f ... demo% what pattern pattern: pattern.f 1.2 96/06/10 |
您还可以创建名为 CTIME 的 PARAMETER,无论何时用 get 命令访问文件,该参数都会自动进行更新。
CHARACTER*(*) CTIME PARAMETER ( CTIME="%E%") |
INCLUDE 文件可以用含有 SCCS 标记的 Fortran 注释加以注解:
C %Z%%M% %I% %E% |
在 Fortran 95 源代码文件中使用单字母派生类型组件名可能会与 SCCS 关键字识别产生冲突。例如,当通过 SCCS 传递时,Fortran 95 结构组件引用 X%Y%Z 在执行 SCCS get 后会变成 XZ。在 Fortran 95 程序中使用 SCCS 时,应注意不要用单个字母定义结构组件。例如,假如 Fortran 95 程序中的结构引用是 X%YY%Z,SCCS 并不会将 %YY% 解释为关键字引用。或者,SCCS get -k 选项在检索文件时将不会扩展 SCCS 关键字 ID。
现在,可以用 SCCS create 命令将这些文件置于 SCCS 控制之下:
demo% sccs create makefile commonblock startupcore.f \ computepts.f pattern.f demo% |
一旦源代码处于 SCCS 控制之下,便可用 SCCS 执行以下两项主要任务:签出文件以便对其进行编辑;签入已编辑完的文件。
使用 sccs edit 命令签出文件。例如:
demo% sccs edit computepts.f |
然后,SCCS 会在当前目录下创建 computepts.f 的可写副本,并记录您的登录名。当文件已签出时,其他用户不能再签出该文件,但可以查出是谁签出了该文件。
在您完成编辑后,使用 sccs delget 命令签入已修改的文件。例如:
demo% sccs delget computepts.f |
该命令会使 SCCS 系统做以下事情:
通过比较登录名确保您就是签出文件的用户
提示您对更改做注释
记录本次编辑会话所更改的内容
从当前目录中删除 computepts.f 的可写副本。
用扩展了 SCCS 关键字的只读副本替换可写副本
sccs delget 命令是两个简单 SCCS 命令(delta 和 get)的复合命令。delta 命令执行上述列表中的前三项任务;get 命令执行后两项任务。