下一个: Intro administrative files, 上一个: Repository storage, 上层: Repository
当我们讨论 cvs 的内部结构时,它就变得越来越可见了,我们可能讨论 cvs 把什么东西放在工作目录的 CVS 目录中。
对仓库而言,cvs 处理该信息而通常用户可以通过 cvs 命令来访问这些信息。
但是在某些情况下,更常用的是让外部程序可以浏览这些信息,例如 jCVS
图形界面和 emacs 的 VC
软件包。
这些程序如果要和其它使用这些文件的程序协同工作的话,应该遵循本节讨论的推荐标准,相关的这些程序包括提到的程序的未来版本和 cvs 的命令行客户端。
CVS 目录包含以下若干个文件。 为了保证未来版本的可扩展性,读取此目录的程序应忽略在此目录中但没有在此归档的文件。
文件以系统习惯的文本方式保存。 这意味着文件在不同存储文本文件习惯的系统之间工作目录是不能移植的。 这是故意的,理论上 cvs 管理的文件在这种系统之间也无法移植。
cvs -d :local:/usr/local/cvsroot checkout yoyodyne/tc
Root 应该包含
:local:/usr/local/cvsroot
Repository 同时包含
/usr/local/cvsroot/yoyodyne/tc
或者
yoyodyne/tc
如果第一个字符是 `/',则格式如下:
/name/revision/timestamp[+conflict]/options/tagdate
其中:`[' 和 `]' 不是格式的一部分,仅仅是代表 `+' 和 conflict 项是可选的。 name 是目录中文件的名字。 revision 是正在编辑的文件派生的修订版本号,`0' 代表新添加的文件,`-'revision 代表删除的文件。 timestamp 为时间戳,表示 cvs 创建文件的时间;如果时间戳和文件修改的时间不一致,意味着文件已经被修改过。 时间戳以 ISO 标准的 C 函数 asctime() 的格式存储(例如,`Sun Apr 7 01:29:26 1996')。 用户也可以不以这种式写入字符串来表示文件已经被修改过,比如,合并结果(`Result of merge')。 但这不是特殊情况;判断一个文件是否被修改,一个程序只要读取改文件的时间戳 timestamp 并进行字符串比较就可以了。 如有冲突,文件做了冲突标记之后会在文件的修改时间上设一个 conflict(参阅 Conflicts example),conflict 表示是否存在版本冲突。 如果 conflict 和文件实际的修改时间相同表示用户还没有解决版本冲突问题。 options 包含可选项(例如对二进制文件可以使用 `-kb')。 tagdate 含有 `T' 后面跟标签名,或 `D' 表示日期,后面跟是 sticky 标签或日期。 注意:如果 timestamp 包含一对以空格分隔的时间戳而不是一个,应该按照早于 cvs1.5 的版本处理(这里没有相关文档)。
CVS/Entries(本地或全球)里时间戳(timestamp)的时区(timezone)应该与操作系统使用的时区相同。 例如,Unix 上文件的时间戳为 UT,CVS/Entries 里的时间戳也应如此。 vms 上时间戳为本地时间,这样在 vms 上的 cvs 应该使用本地时间。 这样文件就不会因为时区(例如,夏时制)改变而显示被修改。
如果 Entries 的某一行的第一个字符是 `D',则该行代表一个子目录。 如果一行只有字符 `D' 则表示生成 Entries 的程序没有记录子目录(因此,如果有这样的一行并且没有别的以字符 `D' 开头的行,可以知道没有子目录)。 否则,行是这样的:
D/name/filler1/filler2/filler3/filler4
其中:name 是子目录的名称,为了保证未来版本的可扩展性,所有的 filler 域都应该被忽略。
修改 Entries
文件的程序应保留这些域。
Entries 文件中行的次序无关紧要。
如果程序选择只是读而不写则可以忽略 Entries.Log。
update
带 `-d' 选项的命令来删除它,该命令将得到附加的文件并且删除 Entries.Static 文件。
edit
或 unedit
等)。
这里还没有归档它的格式。
edit
命令在 Base 目录下保存原来的副本。
这样即使系统不能与服务器进行通信,也允许 unedit
命令操作。
Bname/rev/expansion
其中 expansion 将被忽略,允许将来扩展。